nginx 常用小总结
[root@localhost ~]# nginx -h
nginx version: nginx/1.16.1
Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]
Options:
-?,-h : this help
-v : show version and exit
-V : show version and configure options then exit
-t : test configuration and exit
-T : test configuration, dump it and exit
-q : suppress non-error messages during configuration testing
-s signal : send signal to a master process: stop, quit, reopen, reload
-p prefix : set prefix path (default: /usr/local/nginx/)
-c filename : set configuration file (default: conf/nginx.conf)
-g directives : set global directives out of configuration file
nginx -c /etc/nginx/nginx.conf #指定配置文件启动nginx
nginx -t -c /etc/nginx/nginx.conf #仅测试配置文件,而不启动Nginx
nginx -s stop #可能不保存相关信息,并迅速终止web服务
nginx -s quit #保存相关信息,有安排的结束web服务(优雅关闭)
nginx -s reload #重启重新加载配置文件,等价于关闭再启动
nginx -s reopen #重新打开日志文件
killall -9 nginx #杀死所有进程
kill -HUP `/usr/local/nginx/logs/nginx.pid` #发送HUP信号
##主进程可以处理的信号:
TERM, INT:快速关闭。
QUIT:从容关闭。
HUP:重载配置,启动新配置的工作进程,从容关闭旧的工作进程。
USR1:重新打开日志文件。打开新的log文件,关闭旧的log文件。
USR2:平滑升级可执行程序。启动新的主进程和工作进程。之后可以发送WINCH信号给旧的主进程,从容关闭旧的工作进程,之后可以再发送QUIT信号给旧的主进程,从容关闭旧的主进程。(注意,启动新的主进程后,旧的主进程的进程ID会写nginx.pid.oldbin中,新的主进程的进程ID会写入nginx.pid中。)
WINCH:正常关闭工作进程。
工作进程可以处理的信号:
TERM, INT:快速关闭。
QUIT:正常关闭。
USER1:重新打开日志文件。
HTTP模块、
Event模块、
Mail模块
HTTP Access模块、
HTTP FastCGI模块、
HTTP Proxy模块、
HTTP Rewrite模块
HTTP
Upstream
Request
Hash模块、
Notice模块、
HTTP Access Key模块
使用场景 高可用 服务器横向拓展,
Nginx
本身是不支持 fair
的,如果需要使用这种调度算法,必须下载Nginx的 upstream_fair
模块。##默认轮询
#设定负载均衡服务器列表
upstream roundrobin {
#后端服务器访问规则
server 192.168.1.115:8080 weight=1; #server1
server 192.168.1.131:8081 weight=1; #server1
server 192.168.1.94:8090 weight=1; #server3
}
server {
listen 80;
server_name 192.168.1.131;
location / {
proxy_pass http://roundrobin;
}
}
#基于hash
#设定负载均衡服务器列表
upstream roundrobin {
#后端服务器访问规则
ip_hash; #添加参数支持哈希
server 192.168.1.115:8080 weight=1; #server1
server 192.168.1.131:8080 weight=1; #server1
server 192.168.1.94:8090 weight=1; #server3
}
server {
listen 80;
server_name 192.168.1.131;
location / {
proxy_pass http://roundrobin;
}
}
##设置后端负载均衡服务器的状态
#设定负载均衡服务器列表
upstream roundrobin {
#后端服务器访问规则
server 192.168.1.115:8080 weight=1; #server1
server 192.168.1.131:8080 down; #server2 不参与负载
server 192.168.1.94:8090 backup; #server3 备份机
}
server {
listen 80;
server_name 192.168.1.131;
location / {
proxy_pass http://roundrobin;
}
}
nginx跟据url进行分流 upstream proxy_pass
http {
#...#
map $zone $up_stream {
^~0769 frontends_0769;
^~0734 frontends_0734;
default frontends_0769;
}
upstream frontends_0769 {
server 127.0.0.1:3333;
}
upstream frontends_0734 {
server 127.0.0.1:3334;
}
server {
#...#
location / {
#...#
if ( $request_uri ~ ^/json/(\d+)/$ ) {
set $zone $1;
proxy_pass http://$up_stream;
}
}
}
}
根据ip分流
location / {
proxy_pass http://192.168.10.5;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
set $fuck 0;
if ($remote_addr = '192.168.10.24') {
set $fuck 1;
}
if ($remote_addr = '192.168.10.169') {
set $fuck 1;
}
if ($fuck = 0){
return 503;
}
}
场景 nginx服务下配置多个项目
location [=|~|~*|^~] /uri/ {
…
}
/ 通用匹配, 如果没有其它匹配,任何请求都会匹配到
= 开头表示精确匹配
^~ 开头表示uri以某个常规字符串开头
~ 开头表示区分大小写的正则匹配
~* 开头表示不区分大小写的正则匹配
!和!*分别为区分大小写不匹配及不区分大小写不匹配 的正则
@ #"@" 定义一个命名的 location,使用在内部定向时,例如 error_page, try_files
$ 匹配结尾的请求
优先级:
正则表达式的优先级大于前缀字符串。如果找到匹配的前缀字符串,仍继续搜索正则表达式,但如果前缀字符串以 ^~ 开头,则不再检查正则表达式。
. : 匹配除换行符以外的任意字符
? : 重复0次或1次
+ : 重复1次或更多次
*: 重复0次或更多次
\d :匹配数字
^ : 匹配字符串的开始
$ : 匹配字符串的结束
{n} : 重复n次
{n,} : 重复n次或更多次
[c] : 匹配单个字符c
[a-z]: 匹配a-z小写字母的任意一个
场景 美化链接 隐藏index.php
示例1
location /download/ {
rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break;
rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra break;
return 403;
}
//示例2 php隐藏index.php
if (!-e $request_filename) {
rewrite ^/(.*)$ /index.php/$1 last;
break;
}
last – 基本上都用这个Flag。
break – 中止Rewirte,不在继续匹配
redirect – 返回临时重定向的HTTP状态302
permanent – 返回永久重定向的HTTP状态301
last:
重新将rewrite后的地址在server标签中执行
break:
将rewrite后的地址在当前location标签中执行
语法为if(condition){…},对给定的条件condition进行判断。如果为真,大括号内的rewrite指令将被执行,if条件(conditon)可以是如下任何内容:
当表达式只是一个变量时,如果值为空或任何以0开头的字符串都会当做false
直接比较变量和内容时,使用=或!=
正则表达式匹配,*不区分大小写的匹配,!~区分大小写的不匹配
-f和!-f用来判断是否存在文件
-d和!-d用来判断是否存在目录
-e和!-e用来判断是否存在文件或目录
-x和!-x用来判断文件是否可执行
$args : #这个变量等于请求行中的参数,同$query_string
$content_length : 请求头中的Content-length字段。
$content_type : 请求头中的Content-Type字段。
$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_filename : 当前请求的文件路径,由root或alias指令与URI请求生成。
$scheme : HTTP方法(如http,https)。
$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”。
$document_uri : 与$uri相同。
location ~ \.php($|/) {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
alias指定的目录是准确的,root是指定目录的上级目录,并且该上级目录要含有location指定名称的同名目录。另外,根据前文所述,使用alias标签的目录块中不能使用rewrite的break。
Nginx设置alias实现虚拟目录 alias与root的用法区别
目录级别规则配置 可实现如下一些功能
htaccess 比较影响速度 虽然nginx可以通过配置支持,但是建议用原生的 rewrite 实现
Nginx map 使用详解
map 的主要作用是创建自定义变量,通过使用 nginx 的内置变量,去匹配某些特定规则,如果匹配成功则设置某个值给自定义变量。 而这个自定义变量又可以作于他用。
其实就是验证请求来源
location ~* \.(gif|jpg|swf)$ {
valid_referers none blocked start.igrow.cn sta.igrow.cn;
if ($invalid_referer) {
rewrite ^/ http://$host/logo.png;
}
}
server {
listen 80 default;
server_name _;
return 403;
}
gzip压缩功能就是可以让你节省不少带宽,但是会增加服务器CPU的开销
gzip on; (启用 gzip 压缩功能)
gzip_proxied any; (nginx 做前端代理时启用该选项,表示无论后端服务器的headers头返回什么信息,都无条件启用压缩)
gzip_min_length 1024; (最小压缩的页面,如果页面过于小,可能会越压越大,这里规定大于1K的页面才启用压缩)
gzip_buffers 4 8k; (设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流)
gzip_comp_level 3; (压缩级别,1压缩比最小处理速度最快,9压缩比最大但处理最慢,同时也最消耗CPU,一般设置为3就可以了)
gzip_types text/plain text/css application/x-javascript application/javascript application/xml; (什么类型的页面或文档启用压缩)
一般一个进程足够了,你可以把连接数设得很大。如果有SSL、gzip这些比较消耗CPU的工作,而且是多核CPU的话,可以设为和CPU的数量一样。或 者要处理很多很多的小文件,而且文件总大小比内存大很多的时候,也可以把进程数增加,以充分利用IO带宽(主要似乎是IO操作有block)。
根据我配置实践,服务器是“多个CPU+gzip+网站总文件大小大于内存”的环境,worker_processes设置为CPU个数的两倍比较好。
nginx需要配置status。
log_format main '$remote_addr - r e m o t e u s e r [ remote_user [ remoteuser[time_local] “$request” ’
'$status b o d y b y t e s s e n t " body_bytes_sent " bodybytessent"http_referer" ’
‘“ h t t p u s e r a g e n t " " http_user_agent" " httpuseragent""http_x_forwarded_for”"$request_time"’;
$remote_addr, $http_x_forwarded_for 记录客户端IP地址
$remote_user 记录客户端用户名称
$request 记录请求的URL和HTTP协议
$status 记录请求状态
$body_bytes_sent 发送给客户端的字节数,不包括响应头的大小; 该变量与Apache模块mod_log_config里的“%B”参数兼容。
$bytes_sent 发送给客户端的总字节数。
$connection 连接的序列号。
$connection_requests 当前通过一个连接获得的请求数量。
$msec 日志写入时间。单位为秒,精度是毫秒。
$pipe 如果请求是通过HTTP流水线(pipelined)发送,pipe值为“p”,否则为“.”。
$http_referer 记录从哪个页面链接访问过来的
$http_user_agent 记录客户端浏览器相关信息
$request_length 请求的长度(包括请求行,请求头和请求正文)。
$request_time 请求处理时间,单位为秒,精度毫秒; 从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。
$time_iso8601 ISO8601标准格式下的本地时间。
$time_local 通用日志格式下的本地时间。
$upstream_response_time 是指从Nginx向后端(php-cgi)建立连接开始到接受完数据然后关闭连接为止的时间。
#!/bin/bash
# This script run at 00:00
# The Nginx logs path
logs_path="/exp/nginxlogs/"
mkdir -p ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/
mv ${logs_path}bbs.linuxtone_access.log ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/bbs.linuxtone_access_$(date -d "yesterday" +"%Y%m%d").log
kill -USR1 `cat /usr/local/webserver/nginx/nginx.pid`
crontab -e
00 00 * * * /bin/bash /usr/local/webserver/nginx/sbin/cut_nginx_log.sh
#!/bin/bash
logs_path="/nginx/logs/"
mv ${logs_path}access.log ${logs_path}access_$(date -d "yesterday" +"%Y%m%d").log
kill -USR1 `cat /nginx/logs/nginx.pid`