1. 程式人生 > 實用技巧 >Nginx配置檔案詳解以及配置反向代理和支援跨域

Nginx配置檔案詳解以及配置反向代理和支援跨域

一、簡介:

Nginx是一款輕量級的web伺服器,反向代理伺服器,由於他的記憶體佔用少,啟動快,高併發能力強,在網際網路專案中廣泛應用。

二、Nginx的配置檔案:

如果Nginx是yum安裝;配置檔案預設位置在/etc/nginx/nginx.conf 如果是編譯安裝Nginx,具體配置檔案路徑根據你安裝時指定放置的路徑下

 1 user nginx;
 2 worker_processes auto; #工作程序:數目。根據硬體調整,通常等於CPU數量或者2倍於CPU(auto自動根據伺服器CPU數量進行調整)
 3 error_log /var/log/nginx/error.log; # 錯誤日誌放置路徑
4 pid /run/nginx.pid; #程序PID存放路徑 5 6 include /usr/share/nginx/modules/*.conf; 7 8 events { 9 worker_connections 24400; #指定程序可以開啟的最大描述符:數目。這個指令是指當一個nginx程序開啟的最多檔案描述符數目,理論值應該是最多開啟檔案數(ulimit-n)與nginx程序數相除,但是nginx分配請求並不是那麼均勻,所以最好與ulimit-n的值保持一致。現在在linux2.6核心下開啟檔案開啟數為65535,worker_rlimit_nofile就相應應該填寫65535。這是因為nginx排程時分配請求到程序並不是那麼的均衡,所以假如填寫10240,總併發量達到3-4萬時就有程序可能超過10240了,這時會返回502錯誤
10 }
11 
12 http {
13     log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
14                       '$status $body_bytes_sent "$http_referer" '
15                       '"$http_user_agent" "$http_x_forwarded_for"';
16 
17     access_log  /var/log/nginx/access.log  main;
18 
19    sendfile            on;
20 tcp_nopush on; 21 tcp_nodelay on;
    proxy_connect_timeout90;
    proxy_read_timeout180;
    proxy_send_timeout180;
22 keepalive_timeout 65; 23 types_hash_max_size 2048; 24 25 ## nginx 安全相關配置 26 #關閉檔案索引 27 autoindex on; 28 #隱藏版本號 29 server_tokens off; 30 #設定客戶端請求頭讀取超時時間,超過這個時間還沒有傳送任何資料,Nginx將返回“Request time out(408)”錯誤 31 client_header_timeout 150; 32 #設定客戶端請求主體讀取超時時間,超過這個時間還沒有傳送任何資料,Nginx將返回“Request time out(408)”錯誤 33 client_body_timeout 150; 34 #上傳檔案大小限制 35 client_max_body_size 100m; 36 #指定響應客戶端的超時時間。這個超過僅限於兩個連線活動之間的時間,如果超過這個時間,客戶端沒有任何活動,Nginx將會關閉連線。 37 send_timeout 600; 38 39 include /etc/nginx/mime.types; 40 default_type application/octet-stream; 41 42 include /etc/nginx/conf.d/*.conf; 43 44 server { 45 listen 80 default_server; 46 listen [::]:80 default_server; 47 server_name _; 48 root /usr/share/nginx/html; 49 50 include /etc/nginx/default.d/*.conf; 51 52 location / { 53 } 54 55 } 56 include site-enabled/*.conf; 57 }

(1)全域性塊:

  從配置檔案開始到events塊之間的內容,主要會設定一些影響nginx 伺服器整體執行的配置指令,主要包括配置運待Nginx伺服器的使用者(組)、允許生成的worker process數,程序PID存放路徑、日誌存放路徑和型別以及配置檔案的引入等。

(2)events塊:

  events塊涉及的指令主要影響 Nginx伺服器與使用者的網路連線,常用的設定包括是否開啟對多 work process下的網路連線進行序列化,是否允許同時接收多個網路連線,選取哪種事件驅動模型來處理連線請求,每個 word rocess可以同時支援的最大連線數等。這部分的配置對Nginx的效能影響較大,在實際中應該靈活配置。

  use epoll; nginx採用epoll事件模型,處理效率高

  worker_connections 65535;是單個worker程序允許客戶端最大連線數,這個數值一般根據伺服器效能和記憶體來制定,實際最大值就是worker程序數乘以work_connections。

  multi_accept 告訴nginx收到一個新連線通知後接受盡可能多的連線,預設是on,設定為on後,多個worker按序列方式來處理連線,也就是一個連線只有一個worker被喚醒,其他的處於休眠狀態,設定為off後,多個worker按並行方式來處理連線,也就是一個連線會喚醒所有的worker,直到連線分配完畢,沒有取得連線的繼續休眠。當你的伺服器連線數不多時,開啟這個引數會讓負載有一定的降低,但是當伺服器的吞吐量很大時,為了效率,可以關閉這個引數。

(3)http塊:  

  這算是Nginx伺服器配置中最頻繁的部分,代理、快取和日誌定義等絕大多數功能和第三方模組的配置都在這裡。需要注意的是:http塊也可以包括http全域性塊、server塊。

  Http全域性塊:http全域性塊配置的指令包括檔案引入、MIME-TYPE定義、日誌自定義、連線超時時間、單鏈接請求數上限等。

  Server塊:這塊和虛擬主機有密切關係,虛擬主機從使用者角度看,和一臺獨立的硬體主機是完金一樣的,該技術的產生是為了節省網際網路伺服器硬體成本。每個http塊可以包括多個server塊,而每個server 塊就相當於一個虛擬主機。而每個server塊也分為全域性server塊,以及可以同時包含多個locaton塊。

  全域性Server塊:最常見的配置是本虛擬機器主機的監聽配置和本虛擬主機的名稱或IP配置。

  Location塊:一個server 塊可以配置多個location塊。這塊的主要作用是基於Nginx 伺服器接收到的請求字串(例如 server_name/uri-string),對虛擬主機名稱(也可以是IP別名)之外的字串(例如前面的/uri-string)進行匹配,對特定的請求進行處理。地址定向、資料快取和應答控制等功能,還有許多第三方模組的配置也在這裡進行

  Location匹配原則:可以參考該連結進行檢視:https://www.cnblogs.com/zhaof/p/5945576.html?utm_source=itdadao&utm_medium=referral

  總結:

    1.Location塊宣告時可以使用普通字元字首或者正則表達字元字首進行匹配。

    2.普通字元字首前可以加等於號,進行精確匹配。(例:location = /test.html 表示精確匹配test,當一個頁面使用特別頻繁時使用,可以加快訪問速度)精確匹配完成後就會停止匹配。

    3.普通匹配可以匹配到多個結果,所以先進行普通匹配,一旦匹配到並不會立即停止,會繼續匹配,然後進行正則匹配,若正則匹配到則立即停止,不會進行其他匹配,而是直接使用該結果。若正則匹配不到,則使用普通匹配程度最高的那個結果。

    4.普通uri匹配是沒有順序的,而正則uri匹配是有順序的,從上至下,直至匹配到結果或全部匹配結束。

    5.location後加 ~ 號表示uri中含有正則,並區分大小寫,~*表示包含正則但不不區分大小寫,^~”表示在普通uri前要求Nginx伺服器找到普通uri匹配度最高的那個location後,立即處理此請求,並不再進行正則匹配。

    6.location的執行邏輯和location的編輯順序無關。

三、負載均衡配置

負載均衡實現的是將請求均勻的分配到多個伺服器上進行請求處理,減小單臺伺服器的壓力。

(1)在http全域性塊下配置upstream。(相當於一個均衡負載規則,通過該規則轉發給配置的伺服器)

http {

  # 這裡配置多個伺服器地址,負載均衡
  upstream test {
    server 192.168.111.10:8666;
    server 192.168.111.11:8666;
  }


  server {
    listen       80;
    server_name  www.test.com;

    
    location / {
      #負載均衡規則轉發
      proxy_pass http://test;  
    }
}

(2)如果有多個環境,或者多個域名使用一個Nginx做反向代理,那麼所有的配置都配置主配置檔案上面,那麼後期排查很麻煩,我們可以將個環境配置檔案放置在/etc/nginx/conf.d/目錄下,或者自己自定義目錄

1.配置多個域名訪問不同路徑下前端服務,可以寫在一個配置檔案裡面 ,也可以根據不同域名進行建立各自配置檔案

cd /etc/nginx/conf.d

vimwww.test.com.conf

    server {
        server_name  www.test.com test.com;

        listen 80;
        root         /opt/project/test/;
        if ($host = 'test.com'){
           rewrite ^/(.*)$        http://www.test.com/$1 permanent; # 配置當用戶訪問test.com域名時,自動跳轉到www.test.com這個域名上面

  } }

2.如果多個環境代理後端服務,配置如下(多個環境配置多個檔案即可)

server {
    listen       80;
    server_name  api.test.com test.com ;
    error_page   500 502 503 504 /50x.html;
    error_page   404 /404.html;

    location /path/ {
                #include  /etc/nginx/add-header.ini;
        proxy_pass http://192.168.111.10:10202/;
            }
     location /path1/ {
                #include  /etc/nginx/add-header.ini;
        proxy_pass http://192.168.111.10:10203/;
            }
    # 如果後端配置Nginx支援webSocket加入後面相關引數
       location /path3/ {
                #include  /etc/nginx/add-header.ini;
        proxy_pass http://192.168.111.12:10204/;
                proxy_set_header Host $http_host;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
            }
}    

(3)負載均衡的多種方式。

a.輪詢(預設),按請求時間順序分發到不互通伺服器上。如果伺服器宕機,則自動剔除。

b.權重(weight),根據權重大小分配請求(預設為1),伺服器權重越大,表示可處理的請求越多,接受的請求也越多,用於後端伺服器效能不均的情況。使用,在對應伺服器後加:weight = 權重值;

c.ip_hash,每個請求按訪問的ip的hash結果分配。這樣每個訪客將固定的訪問固定的後端伺服器,解決了session問題。在規則下加ip_hash;然後新增伺服器地址。

d.fair按後端伺服器的響應時間分配,優先最短響應時間分配。在伺服器地址後新增fair

(4)Nginx配置跨域問題:

1.跨域指的是瀏覽器不能執行其它網站的指令碼,它是由瀏覽器的同源策略造成的,是瀏覽器對JavaScript 施加的安全限制。

2.瀏覽器在執行指令碼的時候,都會檢查這個指令碼屬於哪個頁面,即檢查是否同源,只有同源的指令碼才會被執行;而非同源的指令碼在請求資料的時候,瀏覽器會報一個異常,提示拒絕訪問。

相關配置如下:

# 是否允許請求帶有驗證資訊
add_header Access-Control-Allow-Credentials true always;

# 允許跨域訪問的域名,可以是一個域的列表,空格隔開,也可以是萬用字元*(不建議)
add_header Access-Control-Allow-Origin '*' always;

# 允許使用的請求方法,以逗號隔開,可以用 *
add_header Access-Control-Allow-Methods 'POST,GET,OPTIONS,PUT,DELETE' always;

# 預檢命令的快取,如果不快取每次會發送兩次請求,單位為秒。
# 第一次是瀏覽器使用OPTIONS方法發起一個預檢請求,第二次才是真正的非同步請求
add_header Access-Control-Max-Age 3600 always;

# 允許指令碼訪問的返回頭
add_header Access-Control-Allow-Headers 'Access-Control-Allow-Origin,Content-Disposition,Authorization,x-requested-with,content-disposition,Cache-Control,Pragma,Content-Type,Token,Content-Type,Accept,content-type,request-id,user-id,app-id,requestId,request-code,lang,merchantName,language' always;

# 允許自定義的頭部,以逗號隔開,大小寫不敏感
add_header Access-Control-Expose-Headers 'Content-Disposition,WWW-Authenticate,Server-Authorization' always;

# OPTIONS類的請求,是跨域先驗請求
 if ($request_method = 'OPTIONS') {
   return 204; # http狀態碼 204 (無內容) 伺服器成功處理了請求,但沒有返回任何內容。可以返回 200
}

proxy_set_header Host      $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;