1. 程式人生 > >Linux nginx-http配置介紹

Linux nginx-http配置介紹

Linux nginx

nginx工作流程圖
技術分享圖片

http部分工作流程大致如一個master開啟多個worker,網絡io一般用epoll實現當個worker的高並發,文件io用sendfile,aio等高效移步io,實現一個http請求響應。
io部分請參考:http://blog.51cto.com/marvin89/2115474

主腳本請翻閱:http://blog.51cto.com/marvin89/2118341
安裝配置文件:

name: nginx
version: 1.14.0
download: http://nginx.org/download/nginx-{version}.tar.gz
cmds:
  - id nginx ||  useradd -r -M -s /sbin/nologin nginx
yum:
  - yum -y groupinstall "Development tools"
  - yum -y install pcre-devel openssl-devel zlib-devel

uncompress: tar xf nginx-{version}.tar.gz
uncompress_dir: nginx-{version}
compile: ./configure --prefix={source_path}/{name}{version}
                              --conf-path={source_path}/{name}{version}/conf/nginx.conf
                              --error-log-path=/var/log/nginx/error.log
                              --http-log-path=/var/log/nginx/access.log
                              --pid-path=/var/run/nginx.pid
                              --lock-path=/var/run/nginx.lock
                              --user=nginx
                              --group=nginx
                              --with-http_ssl_module
                              --with-http_v2_module
                              --with-http_dav_module
                              --with-http_stub_status_module
                              --with-threads
                              --with-file-aio
                              --with-http_gzip_static_module
                              --add-module=../nginx-http-auth-digest-master
                              && make && make install
depends:
  - name: nginx-http-auth-digest
    version: ‘‘
    download: ‘https://github.com/atomx/nginx-http-auth-digest/archive/master.zip -O nginx-http-auth-digest-master.zip‘
    uncompress: unzip nginx-http-auth-digest-master.zip
    uncompress_dir: ‘‘
    compile: ‘‘
init:
    linkname: nginx
    cmds:
      - cat {source_path}/{name}{version}/conf/nginx.conf|egrep ‘include conf\.d/\*\.conf‘ || sed -i ‘$s#}#\tinclude conf.d/*.conf;\n}#‘ {source_path}/{name}{version}/conf/nginx.conf
      - ‘[ -d {source_path}/{name}{version}/conf/conf.d ] || mkdir {source_path}/{name}{version}/conf/conf.d‘
      - echo ‘export PATH={link_path}/{name}/sbin:$PATH‘>/etc/profile.d/nginx.sh

    systemctl:
          path: /etc/systemd/system/mynginx.service
          content:
              Unit:
                  Description: The Nginx Server
                  After: network.target remote-fs.target nss-lookup.target
              Service:
                  Type: forking
                  PIDFILE: ‘/var/run/nginx.pid‘
                  ExecStart: ‘{link_path}/{name}/sbin/nginx‘
                  ExecReload: ‘{link_path}/{name}/sbin/nginx  -s reload‘
                  ExecStop: ‘{link_path}/{name}/sbin/nginx -s stop‘
                  PrivateTmp: true
              Install:
                  WantedBy: multi-user.target

http配置項說明

1、綁定cpu

綁定cpu場景,服務器以nginx服務為主,不然會影響其他服務性能

沒有綁定前

[root@node1 test]# watch -n0.5 ‘ps axo comm,pid,ppid,psr|grep nginx‘
Every 0.5s: ps axo comm,pid,ppid,psr|grep nginx                                                               Sun May 27 19:35:10 2018

nginx             5047      1   0
nginx             5048   5047   1
nginx             5049   5047   0
nginx             5050   5047   2

可以看到nginx進程時候會不斷切換cpu

綁定cpu

worker_processes  3;
worker_cpu_affinity auto;
#worker_cpu_affinity 0001 0010 0100 1000;#綁定cpu  #如果服務器以nginx為主  這個優化是可以的(如果不是,請勿打開)   用auto就可以了
#用掩碼方式綁定  假如8個cpu  0000 0000    每個0對應一個cpu
[root@node1 test]# watch -n0.5 ‘ps axo comm,pid,ppid,psr|grep nginx‘
Every 0.5s: ps axo comm,pid,ppid,psr|grep nginx                                                               Sun May 27 19:34:18 2018

nginx             4895      1   2
nginx             4896   4895   0
nginx             4897   4895   1
nginx             4898   4895   2

#不會切換cpu,切換cpu會有很多cpu開銷,以及緩存之類

2、進程調優

worker_processes auto;   #超過cpu 核數就沒有意義了   lscpu可以查看   auto最大個數
worker_rlimit_nofile number    cpu個數*worker_connections    最大打開文件描述符
events {
    worker_connections  1024;      #單個進程響應請求數
    use epoll;                    #網絡io復用  用epoll 
    accept_mutex on | off;   #個人推薦Off
    #處理新的連接請求的方法;on意味著由各worker輪流處理新請求,Off意味著每個新請求的到達都會通知所有的worker進程,能者多勞;
}
調整優先級

默認
技術分享圖片

配置參數

worker_priority -5;

技術分享圖片

3、http配置設置

server兜底配置,也可以在每個server中另外配置
When both AIO and sendfile are enabled on Linux, AIO is used for files that are larger than or equal to the size specified in the directio directive, while sendfile is used for files of smaller sizes or when directio is disabled.

http {
     include       mime.types;                    #類型
     default_type  application/octet-stream;     #默認類型八進制數據流

     #日誌定義格式打開
     log_format  main  ‘$remote_addr - $remote_user [$time_local] "$request" ‘
                     ‘$status $body_bytes_sent "$http_referer" ‘
                     ‘"$http_user_agent" "$http_x_forwarded_for"‘;     #http_x_forwarded_for在代理服務器轉發時候記錄源地址

     #配置在這裏是兜底用,也可以不設置,如果設置一定開啟緩存,不然平凡寫入太消耗io
     access_log  logs/access.log  main buffer=4096;   

     #http, server, location配置段都可以
     sendfile        on;         #高效傳輸文件的模式   從內核直接到發送出去,不走客戶端
     tcp_nopush     on;        #在sendfile模式下,是否啟用TCP_CORK選項;   一個文件一個報文發送,應用層首部一個文件只要一次,而不是分開
     aio            on;
     #tcp_nodelay on | off;
            #在keepalived模式下的連接是否啟用TCP_NODELAY選項;   keepalived下 小的包可能會打包一起發送,節約帶寬,但是影響客戶端了
            #tcp_nodelay on 不要等待發送,提升客戶端體驗  如果不是保持連接,這項不存在

     #http, server, location
     keepalive_timeout  65;      #65s   
     keepalive_requests 100;     #100個資源

     #http, server, location客戶端上傳資料大小 post之類;超出此大小時,其將被暫存到磁盤上的由  client_body_temp_path指令所定義的位置;合理定義能小就小   16*1024 字節  5461個中文
     client_body_buffer_size 16k;
     client_max_body_size 20m;  #post 最大值
     client_body_temp_path       client_body_temp_path /dev/shm/nginx/body_temp/ 1 2 ;  #目錄要在/dev/shm下面
        /dev/shm/nginx/body_temp/1/05/0000000051
        1:表示用一位16進制數字表示一級子目錄;0-f
        2:表示用2位16進程數字表示二級子目錄:00-ff
        2:表示用2位16進程數字表示三級子目錄:00-ff

     include conf.d/*.conf;
}

4、文件io優化

文件操作優化的常用配置
aio on
open_file_cache max=N 

官方配置
open_file_cache          max=1000 inactive=20s;
open_file_cache_valid    30s;
open_file_cache_min_uses 2;
open_file_cache_errors   on;

其他否是默認值
    sendfile on  ;   內核減少復制過程  適合小文件
    aio on | off | threads[=pool];     多線程讀取本地io
        是否啟用aio功能;

    directio size | off;     #使用大文件讀取,不會讀cache或者存入buffer
        在Linux主機啟用O_DIRECT標記,此處意味文件大於等於給定的大小時使用,例如directio 4m;

    open_file_cache off;
        open_file_cache max=N [inactive=time];
            nginx可以緩存以下三種信息:
                (1) 文件的描述符、文件大小和最近一次的修改時間;
                (2) 打開的目錄結構;
                (3) 沒有找到的或者沒有權限訪問的文件的相關信息;

            max=N:可緩存的緩存項上限;達到上限後會使用LRU算法實現緩存管理;

            inactive=time:緩存項的非活動時長,在此處指定的時長內未被命中的或命中的次數少於open_file_cache_min_uses指令所指定的次數的緩存項即為非活動項;

    open_file_cache_valid time;
        緩存項有效性的檢查頻率;默認為60s; 

    open_file_cache_min_uses number;
        在open_file_cache指令的inactive參數指定的時長內,至少應該被命中多少次方可被歸類為活動項;

    open_file_cache_errors on | off;
        是否緩存查找時發生錯誤的文件一類的信息;

5、認證

明文

[root@node1 conf]# htpasswd -c -m .ngxpasswd tom
[root@node1 conf]# htpasswd  -m .ngxpasswd jack

location ^~ /admin/ {
      auth_basic "admin area";
      auth_basic_user_file .ngxpasswd;   #根nginx.conf同一個層級
}

密文

https://www.nginx.com/resources/wiki/modules/auth_digest/

[root@node1 conf]# htdigest -c .passwd_digest ‘digest‘ tom
[root@node1 conf]# htdigest  .passwd_digest ‘digest‘ jack

      location ^~ /admins/ {
                auth_digest "digest";
                auth_digest_user_file .passwd_digest;
        }

技術分享圖片

6、http狀態

location ^~ /basic_status/ {
        stub_status;
}

Active connections: 4 
server accepts handled requests
 25825 25825 25885 
Reading: 0 Writing: 1 Waiting: 3 

Active connections: 活動狀態的連接數;
accepts:已經接受的客戶端請求的總數;
handled:已經處理完成的客戶端請求的總數;
requests:客戶端發來的總的請求數;
Reading:處於讀取客戶端請求報文首部的連接的連接數;
Writing:處於向客戶端發送響應報文過程中的連接數;
Waiting:處於等待客戶端發出請求的空閑連接數;

7、location優先級

~:對URI做正則表達式模式匹配,區分字符大小寫;
~*:對URI做正則表達式模式匹配,不區分字符大小寫;
^~:對URI的左半部分做匹配檢查,不區分字符大小寫;
不帶符號:匹配起始於此uri的所有的url;
匹配優先級:=, ^~, ~/~*,不帶符號;

1   =:對URI做精確匹配
location = / {
    [ configuration A ]
}

2   ~:對URI做正則表達式模式匹配,區分字符大小寫;
location ^~ /images/ {
    [ configuration D ]
}

2   ^~:對URI的左半部分做匹配檢查,不區分字符大小寫;
location ~* \.(gif|jpg|jpeg)$ {
    [ configuration E ]
}

3    不帶符號:匹配起始於此uri的所有的url;  不帶符號的長度越長優先級越高
location /images/ {
   root /webapps/app1/data/     #根/webapps/app1/data/  在根下面尋找

   #alias 匹配路徑別名/images/  別名到/webapps/app1/data/ 路徑下
   #http://www.test.develop/images/a.jpg    匹配/images/ 註意/;還剩a.jpg  /webapps/app1/data/必須要/    /webapps/app1/data/a.jpg
   #如果匹配的是/images;還剩/a.jpg         /webapps/app1/data[/]/a.jpg
   alias /webapps/app1/data/     
}

location / {
    [ configuration B ]
}
優先級從高到低

8、日誌

access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log /www/data/nginx/logs/test.log main buffer=2048;   默認是隨時寫入,必須設置
access_log off;

access_log path;   #每個server都可以開啟一個自己的日誌
location ^~ /basic_status/ {
        stub_status;
        access_log off;    #有些地址請求不要記錄日誌
}

open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
open_log_file_cache off;
緩存各日誌文件相關的元數據信息;

max:緩存的最大文件描述符數量;
min_uses:在inactive指定的時長內訪問大於等於此值方可被當作活動項;
inactive:非活動時長;
valid:驗正緩存中各緩存項是否為活動項的時間間隔;

9、壓縮

技術分享圖片
配置壓縮

gzip  on;
gzip_comp_level 6;
gzip_min_length 64;
gzip_proxied any;
gzip_types text/xml text/css  application/javascript;

壓縮後,塊狀傳輸
技術分享圖片

10、rewrite

只有在location中規則才會循環,相當於以下循環
last = continue
break = break

while True:
        rewrite /(.*)\.png$     /$1.jpg break;
        rewrite /(.*)\.jpg$     /$1.png break;

死循環

location ~* \.(jpg|png)$ {
        rewrite /(.*)\.png$     /$1.jpg;      
        rewrite /(.*)\.jpg$     /$1.png;
        root /www/data/nginx/test;
        allow all;
}

break 停止rewrite匹配

location ~* \.(jpg|png)$ {
        rewrite /(.*)\.png$     /$1.jpg break;
        rewrite /(.*)\.jpg$     /$1.png break;
        root /www/data/nginx/test;
        allow all;
}

last break 只在nginx內部實現,客戶端無感知
redirect 是先把匹配到的結果返回給客戶端,實現302重定向

rewrite /(.*)\.png$     /$1.jpg redirect;

技術分享圖片

permanent永久重定向

 rewrite /(.*)\.png$     /$1.jpg permanent;

技術分享圖片

11、referer防盜鏈

        location ~* \.(jpg|png)$ {
                valid_referers none block  www.test.develop;
                if ($invalid_referer){
                        return 403;
                }
                rewrite /(.*)\.png$     http://www.test.develop/$1.jpg redirect;
                root /www/data/nginx/test;
                allow all;
        }

none:請求報文首部沒有referer首部;
blocked:請求報文的referer首部沒有值;
server_names:參數,其可以有值作為主機名或主機名模式;
    arbitrary_string:直接字符串,但可使用*作通配符;
    regular expression:被指定的正則表達式模式匹配到的字符串;要使用~打頭,例如 ~.*\.zander\.com;               

Linux nginx-http配置介紹