nginx 小结

nginx 常用小总结

nginx 命令

nginx -h 命令可以查看所有命令的帮助
[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 #杀死所有进程
用信号(signal)控制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:重新打开日志文件。

nginx 模块介绍

  • 核心模块

    HTTP模块、

    Event模块、

    Mail模块

  • 基本模块

    HTTP Access模块、

    HTTP FastCGI模块、

    HTTP Proxy模块、

    HTTP Rewrite模块

  • 第三方模块

    HTTP

    Upstream

    Request

    Hash模块、

    Notice模块、

    HTTP Access Key模块

nginx 负载均衡

使用场景 高可用 服务器横向拓展,

  • 轮询(默认)
  • ip_hash
  • weight
  • url_hash
  • fair 这是比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。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一些特殊的流量转发配置

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;
           }          
         }

Location配置

场景 nginx服务下配置多个项目

url正则匹配
 location [=|~|~*|^~] /uri/ {
 	…
 }

/ 通用匹配, 如果没有其它匹配,任何请求都会匹配到

= 开头表示精确匹配

^~ 开头表示uri以某个常规字符串开头

~ 开头表示区分大小写的正则匹配

~* 开头表示不区分大小写的正则匹配

!和!*分别为区分大小写不匹配及不区分大小写不匹配 的正则

@ #"@" 定义一个命名的 location,使用在内部定向时,例如 error_page, try_files

$ 匹配结尾的请求

优先级:

​ 正则表达式的优先级大于前缀字符串。如果找到匹配的前缀字符串,仍继续搜索正则表达式,但如果前缀字符串以 ^~ 开头,则不再检查正则表达式。

常用正则

. : 匹配除换行符以外的任意字符
? : 重复0次或1次
+ : 重复1次或更多次
*: 重复0次或更多次
\d :匹配数字
^ : 匹配字符串的开始
$ : 匹配字符串的结束
{n} : 重复n次
{n,} : 重复n次或更多次
[c] : 匹配单个字符c
[a-z]: 匹配a-z小写字母的任意一个

ReWrite语法

场景 美化链接 隐藏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;
  }
flag标志位
last – 基本上都用这个Flag。
break – 中止Rewirte,不在继续匹配
redirect – 返回临时重定向的HTTP状态302
permanent – 返回永久重定向的HTTP状态301

last:
    重新将rewrite后的地址在server标签中执行
break:
    将rewrite后的地址在当前location标签中执行

if判断指令

语法为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相同。

杂项

支持 php pathinfo
 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 区别

alias指定的目录是准确的,root是指定目录的上级目录,并且该上级目录要含有location指定名称的同名目录。另外,根据前文所述,使用alias标签的目录块中不能使用rewrite的break。

Nginx设置alias实现虚拟目录 alias与root的用法区别

htaccess

目录级别规则配置 可实现如下一些功能

  • Rewirte
  • 访问控制

htaccess 比较影响速度 虽然nginx可以通过配置支持,但是建议用原生的 rewrite 实现

map

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;
    }
}
如何防止直接用ip访问
server {
 listen 80 default;
 server_name _;
 return 403;
}
gzip 压缩功能

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; (什么类型的页面或文档启用压缩)
concat模块(nginx js、css多个请求合并为一个请求)

参数调优

worker_processes 设置成多少比较合适

一般一个进程足够了,你可以把连接数设得很大。如果有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`
cronolog 方式

日志分析方案

Awstats

epool 模型

fastCGI协议

你可能感兴趣的:(nginx,nginx)