Nginx安裝與使用

ZbyFt發表於2020-05-18

nginx的介紹

  1. Nginx:Web伺服器軟體,高效能,輕量級,滿足企業高併發的WEB網站訪問
  2. Nginx是基於C語言開發的,由Core核心和模組組成,其中核心的設計非常的微小,主要完成使用者請求到來時,讀取Nginx配置檔案,跟Location block匹配,匹配成功之後,呼叫Location中相應的指令進而啟動不同的模組來工作;(多程式-多執行緒)
  3. 基於Linux作業系統平臺如何構建軟體服務:基於YUM二進位制方式,基於MAKE原始碼編譯方式(生產環境推薦),掌握軟體服務安裝,配置,升級,解除安裝操作;

Nginx的高併發得益於其採用了epoll模型,與傳統的伺服器程式架構不同,epoll是Linux核心2.6以後才出現的,Nginx採用epoll模型,非同步非阻塞,而apache採用的是select模型:

  • Select特點:select選擇控制程式碼(檔案)的時候,是遍歷所有控制程式碼,也就是說控制程式碼有事件響應時,select需要遍歷所有控制程式碼才能獲取到哪些控制程式碼有事件通知,因此效率是非常低的
  • epoll的特點:epoll對於控制程式碼事件的選擇不是遍歷的,是事件響應的,就是控制程式碼上事件來就馬上選擇出來,不需要遍歷整個控制程式碼連結串列,因此效率非常高。

nginx的安裝

rpm安裝
rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

yum install nginx -y

https://blog.csdn.net/sqlquan/article/details/101099850`

原始碼安裝
https://www.cnblogs.com/boonya/p/7907999.html

# nginx操作
nginx  # 啟動
nginx -s stop  # 停止
nginx -s reload  # 重新載入

nginx匹配規則

(location =) > (location 完整路徑) > (location ^~ 路徑) > (location ~|~* 正則順序) > (location 部分起始路徑) > (location  /)

location = /index.html
location /index.html
location ^~ /static/  # 目錄匹配,最大字首匹配
location ~ .*\.(html|png)$  # 正則匹配,~大小寫有關,~*忽略大小寫
location @   # location內部重定向的變數

Nginx

nginx模組

Nginx web伺服器最主要就是各種模組的工作,模組從結構上分為核心模組,基礎模組和第三方模組,其中三類模組分別如下:

  • 核心模組:HTTP模組,EVENT模組和MAIL模組等
  • 基礎模組:HTTP Access模組,HTTP FastCGI模組,HTTP Proxy模組和HTTP Rewrite模組;
  • 第三方模組:HTTP Upstream Request Hash模組, Notice模組和HTTP Access Key模組,Limit req模組,Upstream check module等;

Nginx的模組從功能上分為如下三類:

  • Handlers(處理器模組):此類模組直接處理請求,並進行輸出內容和修改headers資訊等操作,Handlers處理器模組一般只能有一個;
  • Filters(過濾器模組):此類模組主要對其他處理器模組輸出的內容進行修改操作,最後由Nginx輸出;
  • Proxies(代理類模組):此類模組是Nginx的HTTP Upstream之類的模組,這些模組主要與後端一些服務比如FastCGI等進行互動,實現服務代理和負載均衡等功能

nginx原理

Nginx是由自身的Core核心和模組組成的,其中Core核心設計微小和簡潔,完成的功能非常的簡單,僅僅是通過查詢Nginx配置檔案(nginx.conf),將客戶端(使用者)的請求對映到一個Location Block(配置段|區域),Location是用於匹配使用者訪問的URL路徑,而Location配置段中有很多指令,一旦匹配到之後,調取相應的模組完成不同的工作;

負載均衡

upstream web_dz {
    ip_hash;  # 會話保持,加上這個,這個的作用就是使一個使用者只訪問固定的一個server
    # max_fails表示嘗試連線的次數,fail_timeout表示超市的時間單位為秒
    server 192.168.0.123:8001 weight=1 max_fails=2 fail_timeout=15s;
    server 192.168.0.124:8001 weight=1 max_fails=2 fail_timeout=15s;
}

server {
    listen 8001;
    server_name www;
    location / {
        # proxy_redirect http://www.baidu.com/;  # 跳轉,也可以用rewrite來實現
        proxy_set_header Host $host;
        proxy_set_header X-Real_IP $remote_addr;  # 使用者的ip
        proxy_set_header X-Forwarded_For $proxy_add_x_forwarded_for;
        proxy_pass http://web_dz
    }
}

處理靜態檔案

server {
    listen 8001;
    server_name www;
    # 正則匹配
    location ~ .*\.(js|css|html|png|jpg|txt|gif|doc|zip|bmp|docs|xls)$ {
        root /data/static;  # alias  /data/static/;
    }
    
    location / {
        root /data/template;
        index index.html index.html;
    }
    
    location /static/ {
        root /data/;  # alias /data/static/;
        # expires定義使用者瀏覽器快取的時間為3天,如果靜態頁面不常更新,可以設定更長,這樣可以節省頻寬和緩解伺服器的壓力,在瀏覽器儲存該型別檔案的天數,
        expires  3d;
    }
}

錯誤處理

server {
    listen 8001;
    server_name www;
    location / {
        proxy_set_header Host $host;
        proxy_pass http://web_dz
    }
    # 當狀態出現500或502時,定位到路由為:/50x.html 
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /data/template;
    }
    # 狀態碼
    error_page 404 /40x.html;
    location = /404.html {
        root /data/template;
    }
}

動靜分離

upstream web_dz {
    ip_hash;  # 會話保持,加上這個,這個的作用就是使一個使用者只訪問固定的一個server
    # max_fails表示嘗試連線的次數,fail_timeout表示超市的時間單位為秒
    server 192.168.0.123:8001 weight=1 max_fails=2 fail_timeout=15s;
    server 192.168.0.124:8001 weight=1 max_fails=2 fail_timeout=15s;
}

server {
    listen 8001;
    # 多個域名訪問
    server_name zs01.com zs02.com;
    location / {
        root html;
        index index.html index.html
        proxy_set_header Host $host;
        proxy_pass http://web_dz
    }
    
    location ~* .*\.(html|htm|js|png|jpeg|css|txt|gif|jpg|gz|bz2|bmp|doc|xls|docs)${
        root /data/static;
    }
    
    location ~* .*\.(php|jsp|do|asp|cgi){
        proxy_set_header Host $host;
        proxy_pass http://web_dz
    }
}

rewrite

  • 對搜尋引擎優化(Search Engine Optimization ,SEO)友好,利於搜尋引擎抓取網站頁面
  • 隱藏網站URL真實地址,瀏覽器顯示更加美觀
  • 網站變更升級,可以基於Rewrite臨時重定向到其他頁面

Nginx Rewrite規則使用中有三個概念需要理解,分別是:Rewrite結尾識別符號,Rewrite規則常用表示式,Rewrite變數,如下三個概念的詳解:

(1) Nginx Rewrite結尾識別符號,用於Rewrite規則末尾,表示規則的執行屬性

last:相當於Apache裡的(L)標記,表示完成rewrite匹配,展示後面的內容,但url不變
break:本條規則匹配完成後,終止匹配,不再匹配後面的規則
redirect:返回302臨時重定向,瀏覽器地址會顯示跳轉後的URL地址
permanent:返回301永久重定向,瀏覽器位址列會顯示跳轉後的URL地址
其中last和break用來實現URL重寫時,瀏覽器位址列URL地址不變

(2)Nginx Rewrite規則常用表示式,主要用於匹配引數/字串及過濾設定

.			匹配任何單字元
[0-9]		匹配字串0-9
[^0-9]		不匹配字串0-9
abc|edf		可選擇的字串:abc|edf	
?			匹配0到1個字元
*			匹配0到多個字元
+			匹配1到多個字元
^			字串開始標誌
$			字串結束標誌
\n			轉義符標誌

(3)Nginx Rewrite變數,常用於匹配HTTP請求頭資訊,瀏覽器主機名,URL等

HTTP_USER_AGENT			使用者使用的代理,例如瀏覽器
HTTP_REFERER			告知伺服器,從那個頁面來訪問的
HTTP_COOKIE				客戶端快取,主要用於儲存使用者名稱和密碼等資訊
HTTP_HOST				匹配伺服器ServerName域名
HTTP_ACCEPT				客戶端的瀏覽器支援的MIME型別
REMOTE_ADDR				客戶端的IP地址
QUERY_STRING			URL中訪問的字串
DOCUMENT_ROOT			伺服器釋出目錄
SERVER_PORT				伺服器埠
SERVER_PROTOCOL			伺服器端協議
TIME_YEAR				年
TIME_MON				月
TIME_DAY				日
跳轉
server {
    listen 8002;
    server_name www.zby.com www.zby02.com;
    if ($host = "www.zby.com"){
        # 訪問:www.zby.com:8002/index 就跳轉到百度url
        # permanent表示永久重定向
        rewrite ^/index$ https://www.baidu.com permanent;
        # 所有的都進行跳轉,$1接收第一個括號裡的資料
        rewrite ^/(.*)$ https://www.baidu.com/$1 permanent;
    }
    location / {
        root /data/template;
        index index.html index.html;
    }
}
禁止ie瀏覽器訪問
server {
    listen 8002;
    server_name www.zby.com www.zby02.com;
    if ($host = "www.zby.com"){
        # 璁塊棶錛歸ww.zby.com:8002/index 灝辮煩杞埌鐧懼害url
        rewrite ^/index$ https://www.baidu.com permanent;
    }
    
    # 禁止ie瀏覽器和谷歌瀏覽器訪問,判斷是什麼東西來訪問該網站
    if ( $http_user_agent ~* "(MSIE)|(Trident/6.0)|(Chrome)|(iphone)"){
        # 返回404狀態碼
        return 404;
    }
    location / {
        root /data/template;
        index index.html index.html;
    }
}
last的作用
server {
    listen 8002;
    server_name www.zby.com www.zby02.com;
    
    # 訪問/目錄,展示hello.html內容,但瀏覽器位址列URL地址不變
    rewrite ^/$ /hello.html last;
    rewrite ^/index.html http://www.zby.com:8002/ permanent;
    
    location / {
        root /data/template;
        index index.html index.html;
    }
}
args的使用
server {
    listen 8002;
    server_name www.zby.com www.zby02.com;
    
    # 抓取查詢字串裡的引數tid,來進行跳轉
    if ($args ~* tid=2020) {
      rewrite ^/(.*)$ http://www.baidu.com permanent;
    }
    
    location / {
        root /data/template;
        index index.html index.html;
    }
}

# 訪問 http://www.zby.com:8002/?tid=2020

優化nginx配置

user  nginx;
# 一般配置與服務的核數一致,檢視cpu核數:命令,lscpu
worker_processes  8;  # 生產環境一般配8個就夠用了

# 為每個程式分配cpu,將8個程式分配到8個cpu,最大化的利用cpu的效率,當然可以寫多個,或者將一個程式分配到多個cpu
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

# 該指令是當一個nginx程式開啟的最多檔案描述符數目,理論值應該是最多開啟檔案數(ulimit -n)與nginx程式數相除,但是nginx分配請求並不是那麼均勻,所以最好與ulimit -n的值保持一致
# 設定系統對一個使用者開啟的檔案數 ulimit -n 60000;
worker_rlimit_nofile 60000;

# 全域性錯誤日誌及PID檔案
# 錯誤日誌定義等級,[debug|info|notice|warn|error|crit]
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    # epoll是對路服用IO中的一種方式,但是僅用於linux2.6以上核心,可以大大提高nginx的效能,預設epoll
    use epoll;
    # 單個後臺worker process程式的最大併發連結數(最大連線數=連線數*程式數)
    worker_connections  10240;  # 一個工作程式就支援連線數為10240,總共支援的連線數為:10240*8
    # 儘可能多的接受請求
    multi_accept on;
}

http {
    include       /etc/nginx/mime.types;  # 識別所有檔案的型別,都在該檔案下,html,txt等等
    # 當訪問的檔案字尾不在該檔案mime.types裡時,響應頭content-type: application/octet-stream
    default_type  application/octet-stream;  # 當mime.types裡面不存在該檔案時,那麼響應頭的content-type就為這個了,這個表示下載,例如,當把mime.types中的txt註釋掉,訪問txt就表示下載了
    
    # 日誌格式
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    # botzero表示日誌標籤,後面可以引用
    log_format  botzero  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
	
    # 表示使用的是botzero的日誌格式,一般用在serve裡,表示一個服務有特有的日誌格式
    # access_log 表示答應日誌
    access_log  /var/log/nginx/access.log  botzero;
	
    # sendfile 指令指定nginx是否第哦啊用sendfile函式(zero copy 方式)來輸出檔案,對於普通應用必須設為on,如果用來進行下載等應用磁碟IO重負載應用,可設定為off,以平衡磁碟與網路I/O處理速度,降低系統的uptime
    sendfile        on;
    
    # 防止網路阻塞
    # tcp_nopush     on;
    
    # 開啟目錄列表訪問,合適下載伺服器(專門提供下載資源的),預設關閉
    # autoindex      off;
    
    # keepalive超時時間,客戶端到伺服器端的連線持續有效時間,當出現對伺服器的後繼請求時,keepalive-timeout功能可避免建立或重新建立連線(節省伺服器資源/CPU/記憶體/網路卡)
    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
    
    # 允許客戶端請求的最大單檔案位元組數 10兆
    client_max_body_size 10m;
    
    # 緩衝區代理緩衝使用者端請求的最大位元組數
    client_body_buffer_size 128k;
        
    # nginx跟後端伺服器連線超時事件(代理連線超時)
    proxy_connect_timeout 300;  # 秒
    
    # 後端伺服器資料回傳時間(代理髮送超時)
    proxy_send_timeout 300;
        
    # 連線成功後,後端伺服器響應時間(代理接收超時)
    proxy_read_timeout 300;
}

下載檔案

user  nginx;
# 一般配置與服務的核數一致,檢視cpu核數:命令,lscpu
worker_processes  8;  # 生產環境一般配8個就夠用了

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

http {
    include       /etc/nginx/mime.types;  # 識別所有檔案的型別,都在該檔案下,html,txt等等
    # 當訪問的檔案字尾不在該檔案mime.types裡時,響應頭content-type: application/octet-stream
    default_type  application/octet-stream;  # 當mime.types裡面不存在該檔案時,那麼響應頭的content-type就為這個了,這個表示下載,例如,當把mime.types中的txt註釋掉,訪問txt就表示下載了
}

展示資料夾裡的檔案(檔案伺服器)

server {
    listen 8002;
    server_name www.zby.com www.zby02.com;

    if ($args ~* tid=2020) {
      rewrite ^/(.*)$ http://www.baidu.com permanent;
    }

    location / {
        root /data/template;
        index index.html index.html;
    }
    
    location /static/ {
      alias /data/static/; #訪問http://127.0.0.1:8002/static/a 訪問的真實路徑為:/data/static/
      #root /data/;  #訪問http://127.0.0.1:8002/static/a 訪問的真實路徑為:/data/static/a/;
      autoindex on; # 開啟目錄列表訪問,合適下載伺服器(專門提供下載資源的),預設關閉
    }
}

root和alias的區別

root和alias都可以定義在location模組中,都是用來指定請求資源的真實路徑,比如:
location /static/ {
  root /data/w3/;  # 後面會把匹配到url,新增到該路徑的下面,即:/data/w3/ + url(/static)
}
請求 http://foofish.net/static/top.gif 這個地址時,那麼在伺服器裡面對應的真正的資是 /data/w3/static/top.gif檔案

注意:真實的路徑是root指定的值加上location指定的值 。


而 alias 正如其名,alias指定的路徑是location的別名,不管location的值怎麼寫,資源的 真實路徑都是 alias 指定的路徑 ,比如:
location /static/ {
  alias /data/w3/;  # 表示匹配到的url都進入到該目錄下
}
同樣請求 http://foofish.net/static/top.gif 時,在伺服器查詢的資源路徑是: /data/w3/top.gif


其他區別:
   1、alias 只能作用在location中,而root可以存在server、http和location中。
   2、alias 後面必須要用 “/” 結束,否則會找不到檔案,而 root 則對 ”/” 可有可無

壓縮檔案

# 開啟壓縮
gzip on;
gzip_min_length 4k;  # 小於4k的檔案就不用壓縮
gzip_buffers   4 128k;  # 提供壓縮空間最小為4k 最大為128k
gzip_http_version 1.1;  # 壓縮協議的版本
# 壓縮級別大小,最大為9,值越小,壓縮後比例越小,CPU處理更快
# 值越大,消耗CPU比較高
gzip_comp_level 6;  # 一般設定為2 4 6,當cpu過高時,設定為2
# 圖片不建議壓縮,壓縮的型別
gzip_types  text/plain application/javascript text/css application/xml;
gzip_vary on;

# 檢視檔案的型別
# 訪問:http://127.0.0.1/static/jquery.js
curl -v http://127.0.0.1/static/jquery.js # 檢視全資訊
culr -I http://127.0.0.1/static/jquery.js # 只檢視響應頭