Detailed configuration and use of nginx

nginx

How nginx works

insert image description here

nginx有两个进程,一个master,一个worker。master相当于是管理者,worker相当于是劳动者。master不处理具体的请求,分发任务给worker,worker进行具体
的请求任务。

insert image description here

对于一个请求,多个work进行争抢,争抢与client请求相对应的互斥锁accept_mutex;worker1争抢到之后,进行连接,处理后续工作

支持并发原因:
1.抢占机制
2.epoll模型(异步非阻塞的通信模式)

Configuration structure diagram:

insert image description here

Configuration file details

#####Nginx配置文件nginx.conf中文详解#####

#根用户root 可以监听linux的所有端口,而普通用户只能监听1024以上的端口,Nginx需要
#监听80端口,所以Nginx的master进程是以root用户启动的。而worker进程是以配置的普通
#用户或者nobody启动的。而master是管理worker进程的创建和销毁。
user nobody;

#nginx进程数,建议设置为等于CPU总核心数。
worker_processes auto; #采用系统的cpu数量
 
#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
#debug级别最低,crit级别最严重
error_log /usr/local/nginx/logs/error.log info;

#进程pid文件
pid /usr/local/nginx/logs/nginx.pid;

events
{
    #参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型
    #是Linux 2.6以上版本内核中的高性能网络I/O模型,linux建议epoll,如果跑在FreeBSD上面,就用kqueue模型。
    #补充说明:
    #与apache相类,nginx针对不同的操作系统,有不同的事件模型
    #A)标准事件模型
    #Select、poll属于标准事件模型,如果当前系统不存在更有效的方法,nginx会选择select或poll
    #B)高效事件模型
    #Kqueue:使用于FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X.使用双处理器的MacOS X系统使用kqueue可能会造成内核崩溃。
    #Epoll:使用于Linux内核2.6版本及以后的系统。
    #/dev/poll:使用于Solaris 7 11/99+,HP/UX 11.22+ (eventport),IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+。
    #Eventport:使用于Solaris 10。 为了防止出现内核崩溃的问题, 有必要安装安全补丁。
    use epoll;

    #单个进程最大连接数(最大连接数=连接数*进程数)
    #根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行。每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为。
    worker_connections 65535;

    #keepalive超时时间。
    keepalive_timeout 60;
    
    accept_mutex  on | off; #默认是off。在处理新连接的方法,on 是指由每个worker进程轮流处理,off则会通知所有worker进行,但只有一个进程获得连接权限
    #注意如果启用accept_mutex on;则会启用accept_mutex_delay 500ms;参数,时间可以设置,表示当一个worker进程在处理新连接时,多长时间以后才会
    重新接受下一个新的请求。

}
 
 
 
#设定http服务器,利用它的反向代理功能提供负载均衡支持
http
{
    #文件扩展名与文件类型映射表
    include mime.types;

    #默认文件类型
    default_type application/octet-stream;

    #默认编码
    #charset utf-8;

    #服务器名字的hash表大小
    #保存服务器名字的hash表是由指令server_names_hash_max_size 和server_names_hash_bucket_size所控制的。参数hash bucket size总是等于hash表的大小,并且是一路处理器缓存大小的倍数。在减少了在内存中的存取次数后,使在处理器中加速查找hash表键值成为可能。如果hash bucket size等于一路处理器缓存的大小,那么在查找键的时候,最坏的情况下在内存中查找的次数为2。第一次是确定存储单元的地址,第二次是在存储单元中查找键 值。因此,如果Nginx给出需要增大hash max size 或 hash bucket size的提示,那么首要的是增大前一个参数的大小.
    server_names_hash_bucket_size 128;

    #客户端请求头部的缓冲区大小。这个可以根据你的系统分页大小来设置,一般一个请求的头部大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。分页大小可以用命令getconf PAGESIZE取得。
    client_header_buffer_size 32k;

    #客户请求头缓冲大小。nginx默认会用client_header_buffer_size这个buffer来读取header值,如果header过大,它会使用large_client_header_buffers来读取。
    large_client_header_buffers 4 64k;

    #设定通过nginx上传文件的大小
    client_max_body_size 8m;

    #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
    #sendfile指令指定 nginx 是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为on。如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度,降低系统uptime。
    sendfile on;

    #开启目录列表访问,合适下载服务器,默认关闭。
    autoindex on;

    #此选项允许或禁止使用socke的TCP_CORK的选项,此选项仅在使用sendfile的时候使用
    tcp_nopush on;
     
    tcp_nodelay on;

    #长连接超时时间,单位是秒
    keepalive_timeout 120;

    #开启gzip配置,是在http层加的
    gzip on;   #开启gzip
    gzip_min_length 1k; #启用gzip压缩的最小文件;小于设置值的文件将不会被压缩
    gzip_buffers 32 4k; #设置压缩所需要的缓冲区大小;建议此项不设置,使用默认值。
    gzip_http_version 1.1;  #设置gzip压缩针对的HTTP协议版本 
    gzip_comp_level 4; # gzip 压缩级别 1-9 ;数字越大压缩的越好,也越占用CPU时间
    gzip_types text/plain application/javascript application/x-javascript 
    text/css application/xml text/javascript application/x-httpd-php image/jpeg 
    image/gif image/png;  # 进行压缩的文件类型。

    #开启限制IP连接数的时候需要使用
    #limit_zone crawler $binary_remote_addr 10m;



    #负载均衡配置
    upstream saogi.cn {
     
        #upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。
        server 127.0.0.1:8080 weight=3;
        server 127.0.0.1:8081 weight=2;
        server 127.0.0.1:8082 weight=3;

        #nginx的upstream目前支持4种方式的分配
        #1、轮询(默认)
        #每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
        #2、weight
        #指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
        #例如:
        #upstream aaaa {
        #    server 127.0.0.1:8081 weight=10;
        #    server 127.0.0.1:8082 weight=10;
        #}
        #2、ip_hash
        #每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
        #例如:
        #upstream bbbb {
        #    ip_hash;
        #    server 127.0.0.1:88;
        #    server 127.0.0.1:80;
        #}
        #tips:
        #upstream cccc{#定义负载均衡设备的Ip及设备状态}{
        #    ip_hash;
        #    server 127.0.0.1:9090 down;
        #    server 127.0.0.1:8080 weight=2;
        #    server 127.0.0.1:6060;
        #    server 127.0.0.1:7070 backup;
        #}
        #在需要使用负载均衡的server中增加 proxy_pass http://bakend/;

        #每个设备的状态设置为:
        #1.down表示单前的server暂时不参与负载
        #2.weight为weight越大,负载的权重就越大。
        #3.max_fails:允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream模块定义的错误
        #4.fail_timeout:max_fails次失败后,暂停的时间。
        #5.backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。

        #nginx支持同时设置多组的负载均衡,用来给不用的server来使用。
        #client_body_in_file_only设置为On 可以讲client post过来的数据记录到文件中用来做debug
        #client_body_temp_path设置记录文件的目录 可以设置最多3层目录
        #location对URL进行匹配.可以进行重定向或者进行新的代理 负载均衡
    }
     
     
     
    #虚拟主机的配置
    server
    {
        #监听端口
        listen 80;

        #域名可以有多个,用空格隔开
        server_name saogi.cn;
        index index.html index.htm index.php;
        root /data/j;
            
        #rewrite地址重写
        # rewrite ^/(.*) http://127.0.0.1/$1  permanent;
        #解释
        #rewrite 是nginx地址跳转指令,开启跳转功能。
        # ^/(.*)  正则,表示匹配所有请求
        # $1 取出前面正则表达式分组括号里面的内容                        
         
        if($host = "127.0.0.1"){
             rewrite ^/(.*) http://saogi.cn/$1  permanent;
        }                                                
                                                                                                       
                                                                                                                                                      
                                                                                                                                                                                                                                                    
        #对******进行负载均衡
        location ~ .*.(php|php5)? {
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            include fastcgi.conf;
        }

         location /img/ {
            alias /data/www/image/;
        }
        #若按照上述配置的话,则访问/img/目录里面的文件时,ningx会自动去/var/www/image/目录找文件
        location /img/ {
            root /data/www/image;
        }
        #若按照这种配置的话,则访问/img/目录下的文件时,nginx会去/var/www/image/img/目录下找文件。         
        #图片缓存时间设置
        location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$
        {
            expires 10d;
        }
         
        #JS和CSS缓存时间设置
        location ~ .*.(js|css)?$
        {
            expires 1h;
        }
         
        #日志格式设定
        #$remote_addr与$http_x_forwarded_for用以记录客户端的ip地址;
        #$remote_user:用来记录客户端用户名称;
        #$time_local: 用来记录访问时间与时区;
        #$request: 用来记录请求的url与http协议;
        #$status: 用来记录请求状态;成功是200,
        #$body_bytes_sent :记录发送给客户端文件主体内容大小;
        #$http_referer:用来记录从那个页面链接访问过来的;
        #$http_user_agent:记录客户浏览器的相关信息;
        #通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。
        log_format access '$remote_addr - $remote_user [$time_local] "$request" '
        '$status $body_bytes_sent "$http_referer" '
        '"$http_user_agent" $http_x_forwarded_for';
         
        #定义本虚拟主机的访问日志
        access_log  /usr/local/nginx/logs/host.access.log  main;
        access_log  /usr/local/nginx/logs/host.access.404.log  log404;
         
        location /deny {
            deny 127.0.0.1; #封锁禁止单个IP
            deny 127.0.0.1 196.0.0.1;#封锁禁止多个IP
            deny 127.0.0.0/8; #封整个段即从127.0.0.1到127.255.255.254
            deny 127.255.0.0/16;#封IP段即从127.255.0.1到127.255.255.254
            deny deny 127.255.255.0/24;#封IP段即从127.255.255.1到127.255.255.254
        
            #只允许几个ip访问,其他都禁止
            allow 106.54.185.180;
            allow 106.54.185.181;
            allow 106.54.185.185;
            deny all; 
            #以下错误写法
            deny all; 
            allow 106.54.185.180;
            allow 106.54.185.181;
            allow 106.54.185.185;
            
            #注意,这里不能将deny all;写在前面,nginx的配置是从上到下的,如果将deny all;放在最前面,会直接导致所有ip都不能访问,下面几条允许的也不会生效
            #如果需要写入的ip比较多,也可以新建配置文件,并在主配置文件中相应模块添加
            #注意事项:
          #1. deny 一定要加一个ip,否则直接跳转到403,不往下执行了;如果403默认页是同一域名下,会造成死循环访问;
          #2. allow的ip段
           #   从允许访问的段位从小到大排列,如127.0.0.0/24 下面才能是10.10.0.0/16
           #   24表示子网掩码:255.255.255.0
           #   16表示子网掩码:255.255.0.0
           #   8表示子网掩码:255.0.0.0
          #3. deny all;结尾 表示除了上面allow的其他都禁止        
  } 
         
         
        #对 "/" 启用反向代理
        location / {
            proxy_pass http://127.0.0.1:88;
            proxy_redirect off;
            proxy_set_header X-Real-IP $remote_addr;
             
            #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
             
            #以下是一些反向代理的配置,可选。
            proxy_set_header Host $host;

            #允许客户端请求的最大单文件字节数
            client_max_body_size 10m;

            #缓冲区代理缓冲用户端请求的最大字节数,
            #如果把它设置为比较大的数值,例如256k,那么,无论使用firefox还是IE浏览器,来提交任意小于256k的图片,都很正常。如果注释该指令,使用默认的client_body_buffer_size设置,也就是操作系统页面大小的两倍,8k或者16k,问题就出现了。
            #无论使用firefox4.0还是IE8.0,提交一个比较大,200k左右的图片,都返回500 Internal Server Error错误
            client_body_buffer_size 128k;

            #表示使nginx阻止HTTP应答代码为400或者更高的应答。
            proxy_intercept_errors on;

            #后端服务器连接的超时时间_发起握手等候响应超时时间
            #nginx跟后端服务器连接超时时间(代理连接超时)
            proxy_connect_timeout 90;

            #后端服务器数据回传时间(代理发送超时)
            #后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据
            proxy_send_timeout 90;

            #连接成功后,后端服务器响应时间(代理接收超时)
            #连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理(也可以说是后端服务器处理请求的时间)
            proxy_read_timeout 90;

            #设置代理服务器(nginx)保存用户头信息的缓冲区大小
            #设置从被代理服务器读取的第一部分应答的缓冲区大小,通常情况下这部分应答中包含一个小的应答头,默认情况下这个值的大小为指令proxy_buffers中指定的一个缓冲区的大小,不过可以将其设置为更小
            proxy_buffer_size 4k;

            #proxy_buffers缓冲区,网页平均在32k以下的设置
            #设置用于读取应答(来自被代理服务器)的缓冲区数目和大小,默认情况也为分页大小,根据操作系统的不同可能是4k或者8k
            proxy_buffers 4 32k;

            #高负荷下缓冲大小(proxy_buffers*2)
            proxy_busy_buffers_size 64k;

            #设置在写入proxy_temp_path时数据的大小,预防一个工作进程在传递文件时阻塞太长
            #设定缓存文件夹大小,大于这个值,将从upstream服务器传
            proxy_temp_file_write_size 64k;
        }
         
         
        location / {
            listen 443; #监听端口
            server_name saogi.cn;# 证书绑定的域名
            ssl_certificate  cert/dawnguo.cn.pem; # 证书文件名称
            ssl_certificate_key cert/dawnguo.cn.key; #证书私钥文件 
            ssl on;  # 由于版本问题,部分版本配置文件需加上ssl on
            ssl_session_timeout 5m;
            ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
            ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #支持协议
            ssl_prefer_server_ciphers on;
        } 
         
        #设定查看Nginx状态的地址
        location /NginxStatus {
            stub_status on;
            access_log on;
            auth_basic "NginxStatus";
            auth_basic_user_file confpasswd;
            #htpasswd文件的内容可以用apache提供的htpasswd工具来产生。
        }
         
        #本地动静分离反向代理配置
        #所有jsp的页面均交由tomcat或resin处理
        location ~ .(jsp|jspx|do)?$ {
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://127.0.0.1:8080;
        }
         
        #所有静态文件由nginx直接读取不经过tomcat或resin
        location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|
        pdf|xls|mp3|wma)$
        {
            expires 15d; 
        }
         
        location ~ .*.(js|css)?$
        {
            expires 1h;
        }
    }
}
######Nginx配置文件nginx.conf中文详解#####

location matches priority rules

1、location的介绍

location用来根据URI来进行不同的定位。通过它可以把网站的不同部分,定位到不同的处理方式上,比如碰到.php,调用php解释器。

2、location的语法

location [=|~|~*|^~] patt {}    中括号可以不写任何参数,此时称为一般匹配。

符号说明:
1) =         表示精确匹配

2) ^~      表示uri以指定字符或字符串开头的前缀匹配,不是正则匹配。一旦匹配成功,则不再查找其他匹配项

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

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

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

规则优先级:
= 高于 ^~ 高于 ~* 等于 ~ 高于 /

因此,大类型可以分为3种

1)location = patt{}  [精准匹配]

2)location   patt{}   [一般匹配]

3)location ~ patt{}  [正则匹配]

nginx command line

nginx  #初次启动,直接可以输入nginx,如要在启动,提示端口冲突
nginx -s  stop  #停止nginx进程  
nginx -s reload  #在不重启nginx的情况下,重新读取配置文件
nginx -c filepath  #指定配置文件启动(默认:conf/nginx.conf)
nginx -h   #查看nginx命令的帮助信息 (  nginx    -?)
nginx -v  #列出版本号
nginx -t   # 检查nginx配置文件的语法是否正确
nginx -T   # 检查nginx配置文件的语法是否正确,然后输出配置信息
nginx -q    #在检查配置文件期间屏蔽非错误信息
nginx -s signal  #给ngixn发送一个信号,分别是
#stop  停止运行   quit    停止    reload   重新读取配置   reopen  重新记录nginx日志

The difference between stop and quit:
#stop is a fast shutdown, regardless of whether there is a request being processed
#quit nginx completes the accepted connection request before exiting, which is more elegant

nginx hot deployment

Features of hot deployment: without restarting nginx, the new application directly replaces the old application

Nginx中支持的几个重要信号
TERM,INT 快速关闭信号
QUIT 从容关闭
HUP 重载配置用新的配置开始新的工作进程从容关闭旧的工作进程(用的比较多)
USR1 重新打开日志文件(用的比较多)
USR2 平滑升级可执行程序
WINCH 从容关闭工作进程

nginx version switching

更换nginx的二进制命令版本
热部署的大致流程
    1.备份旧的程序的二进制文件, 备份nginx命令
    2.编译安装新的二进制文件,覆盖旧的二进制文件,(在装一个版本的nginx,
    且替换旧的nginx命令)
        ngixn解压目录,执行configure,在objs目录下nginx;拷贝到安装目录sbin下
    3.发送USR2信号发给旧的master进程, 
        kill -USR2 旧版本进程id (让旧版本的worker进程不再接受请求,
        并且会启动新版本master进程和work进程)
    4.发送winch信号给旧的master
       kill -WINCH 旧版本进程id (关闭旧版本的worker进程)
   5.发送quit信号给旧的master进程  

Version restoration (feasible when the master process of the original version has not exited)

1.将备份的nginx二进制文件覆盖nginx 
2.拉起原先的work进程 
	**kill ‐HUP 原先版本的master进程id** 
3.关闭新版本地work进程 
     **kill ‐WINCH 新版本地master进程id** 
4.发送quit信号给新的master进程

nginx log

Log Slicing: Control the size of a single log file

1.给当前日志重命名 
		mv access.log "access.log_$(date "+%Y‐%m‐%d")" 
2.发送信号给nginx主进程,让nginx重新生成新的日志文件 
	   ngixn ‐x reopen #这个命令等同于 kill ‐USR1 'cat nginx.pid'  
3.编写定时任务日志切割脚本 
4.定时任务 
	crontab ‐e  #打开定时任务  
	分 时 日 月 周 
	 *    *   *   *   *  命令
示例: 0 0 * * * /bin/bash /usr/local/nginx/logs/cut_nginx_log.sh

Explanation of log format

	log_format #定义日志的格式 
	log_format main '$remote_addr ‐ $remote_user [$time_local] "$request" '  '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; 
	示例:
	#119.123.74.197 ‐ ‐ [05/Apr/2022:10:37:01 +0800]  "GET /png/cc.txt HTTP/1.1" 304 0 "‐"   "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, li ke Gecko) Chrome/100.0.4896.60 Safari/537.36"  "‐"
	$remote_addr 记录访客的客户端ip地址 
    $remote_user 记录远程客户端的访客用户名 
    $time_local 记录访问的时间和地区信息 
    $request 记录用户的http请求的首行信息  
    $status 记录用户的http请求状态,也就是请求发出后,响应的状态 
    $body_bytes_sent 记录服务器发给客户端的响应体数据字节大小 
    $http_referer 记录本次请求是从那个链接过来的,可以根据referer进行防盗链信息 
    $http_user_agent 记录客户端的访问信息,如浏览器信息, 
    $http_x_forwarded_for 代理ip

nginx concurrent number

1.一次请求,需要占用work进程的几个连接数
  2个或者4个
  若nginx作为访问静态资源代理服务: 需要占用2个
  若nginx作为反向代理服务,需要占用4个
 2. nginx有1个master,有4个worker,每个work支持的最大连接数2048; 5 最大并发是多少? 
 如果访问静态资源, 4 * 2048 / 2 
 如果做反向代理, 4 * 2048 / 4
 得出结论 
 静态资源最大并发数: work_connections*worker_processes/2 
 做反向代理最大并发数:work_connections*worker_processes/4

Guess you like

Origin blog.csdn.net/weixin_44021296/article/details/124336774
Recommended