vlambda博客
学习文章列表

话编程 | Nginx使用笔记

启动

/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

查看是否已启动
ps -f | grep nginx
查看所有正在运行的 nginx 进程
ps -ax | grep nginx

查看 nginx 的版本号
/usr/local/nginx/sbin/nginx -v

如果,nginx 已经开启,那么它就可以通过使用 -s 参数的可执行命令控制。使用下列格式:
/usr/local/nginx/sbin/nginx -s signal

signal 可以为下列命令之一:
stop — 直接关闭 nginx
quit — 会在处理完当前正在的请求后退出,也叫优雅关闭
reload — 重新加载配置文件,相当于重启
reopen — 重新打开日志文件 比如,等待当前子进程处理完正在执行的请求后,结束 nginx 进程,可以使用下列命令:
nginx -s quit
nginx -s reload

===============================================
nginx常用配置

配置文件位置
/usr/local/nginx/conf/nginx.conf

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        location ~ \.(gif|jpg|png)${ #会匹配所有以 .gif,.jpg 或者 .png 结尾的 URIs
            root  /data/;
        }

        location ~ /user/ {
            proxy_pass http://127.0.0.1:8081
        }
        location ~ /goods/ {
            proxy_pass http://127.0.0.1:8082
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

测试配置文件是否正常
/usr/local/nginx/sbin/nginx -t

location 指令说明,该指令用于匹配 URL。语法如下:
1、= :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配 成功,就停止继续向下搜索并立即处理该请求。
2、~:用于表示 uri 包含正则表达式,并且区分大小写。
3、~*:用于表示 uri 包含正则表达式,并且不区分大小写。
4、^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字 符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。
注意:如果 uri 包含正则表达式,则必须要有 ~ 或者 ~*标识。

-----------------------------------------------
正向代理配置

server {
    resolver 8.8.8.8;               # 这个字段是必须的,增加dns解析resolver
    resolver_timeout 5s;
    
    listen     192.168.1.100:8080;  # 代理服务器的地址+端口号

    #access_log  logsq/host.access.log  main;
    
    location /{
        #proxy_pass http://$http_host$request_uri;
        proxy_pass $scheme://$http_host$request_uri;
        proxy_set_header Host $http_host;
        proxy_connect_timeout 5;
    }
}

正向代理配置说明

置正向代理参数,均是由 Nginx 变量组成。其中 proxy_set_header 部分的配置,是为了解决如果 URL 中带 “.”(点)后 Nginx 503 错误。
proxy_pass $scheme://$host$request_uri;
proxy_set_header Host $http_host;

配置缓存大小,关闭磁盘缓存读写减少I/O,以及代理连接超时时间
proxy_buffers 256 4k;
proxy_max_temp_file_size 0;
proxy_connect_timeout 30;

配置代理服务器 Http 状态缓存时间
proxy_cache_valid 200 302 10m;
proxy_cache_valid 301 1h;
proxy_cache_valid any 1m;

-----------------------------------------------
反向代理配置

假如启动了两个tomcat:tomcat8081端口:8081,tomcat8082端口:8082。

location ~ /user/ {
    proxy_pass http://127.0.0.1:8081
}
location ~ /goods/ {
    proxy_pass http://127.0.0.1:8082
}

端口:nginx监听端口:80,tomcat8081端口:8081,tomcat8082端口:8082。

-----------------------------------------------
负载均衡

至少启动好两台tomcat服务器,如一台 8081,一台 8082,这两台服务属于同一个应用,如都是user应用。
修改配置文件/usr/local/nginx/conf/nginx.conf,加入upstream配置

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    
    upstream myserver {
        server 127.0.0.1:8081;
        server 127.0.0.1:8082;
    }
    
    server {
        listen       80;
        server_name  localhost;
        location / {
            proxy_pass   http://myserver;
            root   html;
            index  index.html index.htm;
        }
        location ~ \.(gif|jpg|png)${ #会匹配所有以 .gif,.jpg 或者 .png 结尾的 URIs
            root  images;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

负载均衡分配服务器策略
1) 轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。
2) weight:代表权重, 默认为 1,权重越高被分配的客户端越多。
配置方式:
upstream myserver {
    server 127.0.0.1:8081 weight=10;
    server 127.0.0.1:8082 weight=1;
}
3) ip_hash:每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器。
配置方式:
upstream myserver {
    ip_hash;
    server 127.0.0.1:8081 weight=10;
    server 127.0.0.1:8082 weight=1;
}
4) fair(第三方):按后端服务器的响应时间来分配请求,响应时间短的优先分配。
配置方式:
upstream myserver {
    server 127.0.0.1:8081 weight=10;
    server 127.0.0.1:8082 weight=1;
    fair;
}

-----------------------------------------------
动静资源分离

加入nginx根目录下有目录data,目录data中有image和page目录

location /page/ {
    root         /data/;
}
location /image/ {
    root         /data/;
    autoindex    on;
}

-----------------------------------------------
nginx上传文件大小限制修改

ile_uploads on;           #是否允许通过HTTP上传文件的开关。默认为ON即是开 
upload_tmp_dir /usr/local/nginx/temp;          #文件上传至服务器上存储临时文件的地方,如果没指定就会用系统默认的临时文件夹
client_max_body_size 10m; #允许上传文件大小的最大值。默认为2M

-----------------------------------------------
nginx内核优化

net.ipv4.tcp_fin_timeout = 2
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.ip_local_port_range = 4000    65000
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1
net.core.somaxconn = 16384
net.core.netdev_max_backlog = 16384
net.ipv4.tcp_max_orphans = 16384
#以下参数是对iptables防火墙的优化,防火墙不开会提示,可以忽略不理。
net.ipv4.ip_conntrack_max = 25000000
net.ipv4.netfilter.ip_conntrack_max=25000000
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=180
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait=120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait=60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait=120

-----------------------------------------------
nginx全局变量

$args:这个变量等于请求行中的参数,同$query_string
$is_args: 如果已经设置$args,则该变量的值为"?",否则为""
$content_length: 请求头中的Content-length字段。
$content_type: 请求头中的Content-Type字段。
$document_uri: 与$uri相同。
$document_root: 当前请求在root指令中指定的值。
$host: 请求主机头字段,否则为服务器名称。
$http_user_agent: 客户端agent信息。
$http_cookie: 客户端cookie信息。
$limit_rate: 这个变量可以限制连接速率。
$request_method: 客户端请求的动作,通常为GET或POST。
$remote_addr: 客户端的IP地址。
$remote_port: 客户端的端口。
$remote_user: 已经经过Auth Basic Module验证的用户名。
$request_body_file`: 客户端请求主体的临时文件名。
$request_uri: 请求的URI,带参数
$request_filename: 当前请求的文件路径,由root或alias指令与URI请求生成。
$scheme: 所用的协议,比如http或者是https,比如rewrite ^(.+)$ $scheme://example.com$1 redirect;。
$server_protocol: 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
$server_addr: 服务器地址,在完成一次系统调用后可以确定这个值。
$server_name: 服务器名称。
$server_port: 请求到达服务器的端口号。
$request_uri: 包含请求参数的原始URI,不包含主机名,如:/foo/bar.php?arg=baz,它无法修改。
$uri: 不带请求参数的当前URI,$uri不包含主机名,如/foo/bar.html可能和最初的值有不同,比如经过重定向之类的。它可以通过内部重定向,或者使用index指令进行修改。不包括协议和主机名,例如/foo/bar.html。

-----------------------------------------------
开启nginx的监控服务

location /status {  
  stub_status on;        #表示开启stubStatus的工作状态统计功能。
  access_log off;        #access_log off; 关闭access_log 日志记录功能。
  #auth_basic "status";  #auth_basic 是nginx的一种认证机制。
  #auth_basic_user_file conf/htpasswd;    #用来指定密码文件的位置。
}

-----------------------------------------------
配置登录密码

yum install -y httpd-tools
/usr/local/apache/bin/htpasswd -c /usr/local/nginx/conf/htpasswd 123456 
New password:
完成后会在/usr/local/nginx/conf/目录下生成htpasswd文件。