话编程 | 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文件。