項目中經常使用nginx做負載均衡,接口路由、文件、文檔的上傳及下載、視頻的代理播放等等,都離不開nginx的支持,今天我們分享一下其個使用場景。
1、配置文件?nd-nginx.conf
全局配置
#全局配置端,對全局生效,主要設置nginx的啟動用戶/組,啟動的工作進程數量,工作模式,Nginx的PID路徑,日志路徑等。
#user nobody;
#user nginx nginx;#啟動Nginx工作進程的用戶和組
worker_processes 1; #啟動工作進程數數量
#worker_processes [number | auto]; #啟動Nginx工作進程的數量,一般設為和CPU核心數相同
#worker_cpu_affinity 00000001 00000010 00000100 00001000 | auto ;
#將Nginx工作進程綁定到指定的CPU核心,默認Nginx是不進行進程綁定的,綁定并不是意味著當前nginx進程獨占以一核心CPU,
#但是可以保證此進程不會運行在其他核心上,這就極大減少了nginx的工作進程在不同的cpu核心上的來回跳轉,
#減少了CPU對進程的資源分配與回收以及內存管理等,因此可以有效的提升nginx服務器的性能。#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;#pid logs/nginx.pid;#events設置快,主要影響nginx服務器與用戶的網絡連接,比如是否允許同時接受多個網絡連接,
#使用哪種事件驅動模型處理請求,每個工作進程可以同時支持的最大連接數,是否開啟對多工作進程下的網絡連接進行序列化等。
events {#設置單個nginx工作進程可以接受的最大并發,作為web服務器的時候最大并發數為worker_connections * worker_processes,#作為反向代理的時候為(worker_connections * worker_processes)/2worker_connections 1024;
}
文件上面全局配置
2、http 模塊詳解
#http塊是Nginx服務器配置中的重要部分,緩存、代理和日志格式定義等絕大多數功能和第三方模塊都可以在這設置,
#http塊可以包含多個server塊,而一個server塊中又可以包含多個location塊,
#server塊可以配置文件引入、MIME-Type定義、日志自定義、是否啟用sendfile、連接超時時間和單個鏈接的請求上限等。
http {#通用配置....# N個server 模塊虛擬服務器 }
3、http模塊里面通用的配置
include mime.types; #導入支持的文件類型,是相對于/apps/nginx/conf的目錄,在響應報文中將指定的文件擴展名映射至MIME對應的類型default_type application/octet-stream; #除mime.types中文件類型外,設置其它文件默認類型,訪問其它類型時會提示下載不匹配的類型文件#log_format main '$remote_addr - $remote_user [$time_local] "$request" '# '$status $body_bytes_sent "$http_referer" '# '"$http_user_agent" "$http_x_forwarded_for"';#access_log logs/access.log main;#作為web服務器的時候打開sendfile加快靜態文件傳輸,指定是否使用sendfile系統調用來傳輸文件,#sendfile系統調用在兩個文件描述符之間直接傳遞數據(完全在內核中操作),從而避免了數據在內核緩沖區和用戶緩沖區之間的拷貝,#操作效率很高,被稱之為零拷貝,硬盤 >> kernel buffer (快速拷貝到kernelsocket buffer) >>協議棧。sendfile on;#tcp_nopush on;#keepalive_timeout 0;keepalive_timeout 65; ?#長連接超時時間,單位是秒#開啟gzip壓縮,若想關閉gzip壓縮,則需要注釋掉這句話,或者將on換成off#gzip on;#配置允許壓縮的頁面的最小字節數,頁面字節數從header頭中的Content-Length中獲>取,建議設置成1k,因為如果數據小于1k,他也會壓縮成1k,這樣會起到反作用。#gzip_min_length 1k;#4個16k的數據流用于存儲gzip的壓縮結果數據流#gzip_buffers 4 16k;#支持的http版本為1.1#gzip_http_version 1.1;#判斷客戶端是否支持gzip技術,若不支持則不會進行gzip處理#gzip_vary on;# 全局跨域配置#為 * 表示服務器可以接受所有的請求源(Origin),即接受所有跨域的請求,也可以指定一個確定的URLadd_header 'Access-Control-Allow-Origin' '*' always;#可選字段,為true表示允許發送Cookie。同時,發送時,必須設置XMLHttpRequest.withCredentials為true才有效,請求若服務器不允許瀏覽器發送,刪除該字段即可。add_header 'Access-Control-Allow-Credentials' 'true';#代表允許使用指定的方法請求該地址add_header 'Access-Control-Allow-Methods' 'GET, POST, PATCH, DELETE, PUT, OPTIONS';#代表允許在請求該地址的時候帶上指定的請求頭,例如:Content-Type,Authorization,使用逗號(,)拼接起來放在雙引號(")中add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type, X-Custom-Header, Access-Control-Expose-Headers, Token, Authorization';add_header 'Access-Control-Allow-Headers' '*';#代表著在 1728000 秒之內不用請求該地址的時候 不需要再進行預檢請求,也就是跨域緩存。add_header 'Access-Control-Max-Age' 1728000;
4、server 虛擬服務器詳解及通用配置
#每個server用于定義一個虛擬主機,第一個server為默認虛擬服務器server {#設置一個虛擬機主機,可以包含自己的全局快,同時也可以包含多個location模塊。#比如本虛擬機監聽的端口、本虛擬機的名稱和IP配置,多個server 可以使用一個端口,比如都使用80端口提供web服務listen 80;?#配置server監聽的端口server_name localhost; #本server的名稱,當訪問此名稱的時候nginx會調用當前serevr內部的配置進程匹配。#是否在響應報文中的Content-Type顯示指定的字符集,默認off不顯示#charset charset | off;#charset koi8-r;#設置編碼格式,默認是俄語格式,建議改為utf-8#示例#charset utf-8;#access_log logs/host.access.log main;autoindex on; # 顯示目錄,默認不開啟autoindex_localtime on;# 顯示文件修改時間 # 顯示文件大小#多個 location 配置....}
5、server 中 多個location 配置?
#以http的方式轉發mp4請求到指定web服務器。#訪問 http://127.0.0.1/6d.mp4 就可以播放視頻,而視頻6d.mp4就在html/dist目錄下。location ~ /.mp4$ {#root E:\sh\nginx; # 你的文件目錄mp4; # 支持mp4mp4_buffer_size 10m;#處理mp4初始內存大小mp4_max_buffer_size 50m;#處理mp4最大內存大小}location / {root html/dist;#相當于默認頁面的目錄名稱,默認是安裝目錄的相對路徑,可以使用絕對路徑配置。index index.html index.htm;#默認的頁面文件名稱#給OPTIONS 添加 204 的返回,為了處理在發送POST請求時Nginx依然拒絕訪問的錯誤,發送"預檢請求"時,需要用到方法 OPTIONS,所以服務器需要允許該方法。if ($request_method = 'OPTIONS') {return 204;}}#proxy_pass的配置詳解在后面location /test {proxy_pass http://127.0.0.1:9006;proxy_redirect off;#關閉重定向#proxy_redirect #舊地址 新地址;#proxy_redirect default; #默認配置#若客戶端發過來的請求header中有HOST這個字段,$http_host和$host表示的就是原始請求host,比如請求的時候HOST的值是http://demo.com,那么反代后還是http://demo.com。proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;#將$remote_addr的值放進變量X-Real-IP中,此變量名可變,$remote_addr的值為客戶端的ipproxy_set_header X-forwarded-For $proxy_add_x_forwarded_for;#獲得用戶真實ip}location /ars {proxy_pass http://192.8.3.211:9006;}#/person/getPersonUrllocation /kvc {add_header 'Access-Control-Allow-Origin' '*' ;add_header 'Access-Control-Allow-Credentials' 'true';add_header 'Access-Control-Allow-Methods' '*';add_header 'Access-Control-Allow-Headers' '*';add_header 'Access-Control-Max-Age' 1728000;proxy_pass http://192.8.3.211:1288;}location /about {root /app/html; #必須要在html目錄中創建一個名為about的目錄才可以訪問,否則報錯。}location /about { #注意about后不要加/ , 使用alias的時候uri后面如果加了斜杠,則下面的路徑配置必須加斜杠,否則403alias /opt/html/about; #當訪問about的時候,會顯示alias定義的/opt/html/about里面的內容。}#注意:location中使用root指令和alias指令的意義不同#root 給定的路徑對應于location中的/uri 左側的/#alias 給定的路徑對應于location中的/uri 的完整路徑#error_page 404 /404.html;#錯誤頁面的文件名稱# redirect server error pages to the static page /50x.html#error_page 500 502 503 504 /50x.html;#錯誤頁面的文件名稱location = /50x.html { #location處理對應的不同錯誤碼的頁面定義到/50x.html,這個跟對應其server中定義的目錄下。root html;#定義默認頁面所在的目錄}
6、第二個server,單獨處理視頻播放
#serverd第二個服務虛擬服務器#訪問http://127.0.0.1:8088/6d.mp4 就可以播放視頻,而視頻6d.mp4就在E:/sh/nginx/nginx目錄下。server {listen 8088;server_name 127.0.0.1;charset utf-8,gbk;#root /usr/local/nginx/html/files; # 你的文件目錄root E:/sh/nginx/nginx; # 你的文件目錄# 顯示目錄,默認不開啟autoindex on;# 顯示文件大小# 顯示文件修改時間autoindex_localtime on;location ~ /.mp4$ {mp4; # 支持mp4mp4_buffer_size 10m;mp4_max_buffer_size 50m;}}
7、第三個server 單獨展示圖片
#作為下載服務器配置#官方文檔:http://nginx.org/en/docs/http/ngx_http_autoindex_module.html#作為上傳服務器# 定義緩存目錄proxy_cache_path E:/sh/nginx/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m;server {listen 8081;location ~* /.(jpg|jpeg|png|gif)$ {# 開啟緩存功能proxy_cache my_cache;# 指定緩存時間(單位為秒)proxy_cache_valid any 30d;# 如果未命中緩存則從后端服務器獲取并進行緩存#proxy_pass http://backend-server;# 其他相關配置...}location ~* /.(css|js)$ {#1h代表一小時expires 1h;# 開啟緩存功能proxy_cache my_cache;# 指定緩存時間(單位為秒)proxy_cache_valid any 30d;}}
8、整個配置文件展示
#全局配置端,對全局生效,主要設置nginx的啟動用戶/組,啟動的工作進程數量,工作模式,Nginx的PID路徑,日志路徑等。
#user nobody;
#user nginx nginx;#啟動Nginx工作進程的用戶和組
worker_processes 1; #啟動工作進程數數量
#worker_processes [number | auto]; #啟動Nginx工作進程的數量,一般設為和CPU核心數相同
#worker_cpu_affinity 00000001 00000010 00000100 00001000 | auto ;
#將Nginx工作進程綁定到指定的CPU核心,默認Nginx是不進行進程綁定的,綁定并不是意味著當前nginx進程獨占以一核心CPU,
#但是可以保證此進程不會運行在其他核心上,這就極大減少了nginx的工作進程在不同的cpu核心上的來回跳轉,
#減少了CPU對進程的資源分配與回收以及內存管理等,因此可以有效的提升nginx服務器的性能。#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;#pid logs/nginx.pid;#events設置快,主要影響nginx服務器與用戶的網絡連接,比如是否允許同時接受多個網絡連接,
#使用哪種事件驅動模型處理請求,每個工作進程可以同時支持的最大連接數,是否開啟對多工作進程下的網絡連接進行序列化等。
events {#設置單個nginx工作進程可以接受的最大并發,作為web服務器的時候最大并發數為worker_connections * worker_processes,#作為反向代理的時候為(worker_connections * worker_processes)/2worker_connections 1024;
}#http塊是Nginx服務器配置中的重要部分,緩存、代理和日志格式定義等絕大多數功能和第三方模塊都可以在這設置,
#http塊可以包含多個server塊,而一個server塊中又可以包含多個location塊,
#server塊可以配置文件引入、MIME-Type定義、日志自定義、是否啟用sendfile、連接超時時間和單個鏈接的請求上限等。
http {include mime.types; #導入支持的文件類型,是相對于/apps/nginx/conf的目錄,在響應報文中將指定的文件擴展名映射至MIME對應的類型default_type application/octet-stream; #除mime.types中文件類型外,設置其它文件默認類型,訪問其它類型時會提示下載不匹配的類型文件#log_format main '$remote_addr - $remote_user [$time_local] "$request" '# '$status $body_bytes_sent "$http_referer" '# '"$http_user_agent" "$http_x_forwarded_for"';#access_log logs/access.log main;#作為web服務器的時候打開sendfile加快靜態文件傳輸,指定是否使用sendfile系統調用來傳輸文件,#sendfile系統調用在兩個文件描述符之間直接傳遞數據(完全在內核中操作),從而避免了數據在內核緩沖區和用戶緩沖區之間的拷貝,#操作效率很高,被稱之為零拷貝,硬盤 >> kernel buffer (快速拷貝到kernelsocket buffer) >>協議棧。sendfile on;#tcp_nopush on;#keepalive_timeout 0;keepalive_timeout 65; ?#長連接超時時間,單位是秒#開啟gzip壓縮,若想關閉gzip壓縮,則需要注釋掉這句話,或者將on換成off#gzip on;#配置允許壓縮的頁面的最小字節數,頁面字節數從header頭中的Content-Length中獲>取,建議設置成1k,因為如果數據小于1k,他也會壓縮成1k,這樣會起到反作用。#gzip_min_length 1k;#4個16k的數據流用于存儲gzip的壓縮結果數據流#gzip_buffers 4 16k;#支持的http版本為1.1#gzip_http_version 1.1;#判斷客戶端是否支持gzip技術,若不支持則不會進行gzip處理#gzip_vary on;# 全局跨域配置#為 * 表示服務器可以接受所有的請求源(Origin),即接受所有跨域的請求,也可以指定一個確定的URLadd_header 'Access-Control-Allow-Origin' '*' always;#可選字段,為true表示允許發送Cookie。同時,發送時,必須設置XMLHttpRequest.withCredentials為true才有效,請求若服務器不允許瀏覽器發送,刪除該字段即可。add_header 'Access-Control-Allow-Credentials' 'true';#代表允許使用指定的方法請求該地址add_header 'Access-Control-Allow-Methods' 'GET, POST, PATCH, DELETE, PUT, OPTIONS';#代表允許在請求該地址的時候帶上指定的請求頭,例如:Content-Type,Authorization,使用逗號(,)拼接起來放在雙引號(")中add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type, X-Custom-Header, Access-Control-Expose-Headers, Token, Authorization';add_header 'Access-Control-Allow-Headers' '*';#代表著在 1728000 秒之內不用請求該地址的時候 不需要再進行預檢請求,也就是跨域緩存。add_header 'Access-Control-Max-Age' 1728000;#每個server用于定義一個虛擬主機,第一個server為默認虛擬服務器server {#設置一個虛擬機主機,可以包含自己的全局快,同時也可以包含多個location模塊。#比如本虛擬機監聽的端口、本虛擬機的名稱和IP配置,多個server 可以使用一個端口,比如都使用80端口提供web服務listen 80;?#配置server監聽的端口server_name localhost; #本server的名稱,當訪問此名稱的時候nginx會調用當前serevr內部的配置進程匹配。#是否在響應報文中的Content-Type顯示指定的字符集,默認off不顯示#charset charset | off;#charset koi8-r;#設置編碼格式,默認是俄語格式,建議改為utf-8#示例#charset utf-8;#access_log logs/host.access.log main;autoindex on; # 顯示目錄,默認不開啟autoindex_localtime on;# 顯示文件修改時間 # 顯示文件大小#以http的方式轉發mp4請求到指定web服務器。#訪問 http://127.0.0.1/6d.mp4 就可以播放視頻,而視頻6d.mp4就在html/dist目錄下。location ~ /.mp4$ {#root E:\sh\nginx; # 你的文件目錄mp4; # 支持mp4mp4_buffer_size 10m;#處理mp4初始內存大小mp4_max_buffer_size 50m;#處理mp4最大內存大小}location / {root html/dist;#相當于默認頁面的目錄名稱,默認是安裝目錄的相對路徑,可以使用絕對路徑配置。index index.html index.htm;#默認的頁面文件名稱#給OPTIONS 添加 204 的返回,為了處理在發送POST請求時Nginx依然拒絕訪問的錯誤,發送"預檢請求"時,需要用到方法 OPTIONS,所以服務器需要允許該方法。if ($request_method = 'OPTIONS') {return 204;}}#proxy_pass的配置詳解區別 https://blog.csdn.net/jsxztshaohaibo/article/details/134578031location /test {proxy_pass http://127.0.0.1:9016;proxy_redirect off;#關閉重定向#proxy_redirect #舊地址 新地址;#proxy_redirect default; #默認配置#若客戶端發過來的請求header中有HOST這個字段,$http_host和$host表示的就是原始請求host,比如請求的時候HOST的值是http://demo.com,那么反代后還是http://demo.com。proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;#將$remote_addr的值放進變量X-Real-IP中,此變量名可變,$remote_addr的值為客戶端的ipproxy_set_header X-forwarded-For $proxy_add_x_forwarded_for;#獲得用戶真實ip}location /artemis {proxy_pass http://192.8.3.211:9006;}#/person/getPersonUrllocation /kcvc {add_header 'Access-Control-Allow-Origin' '*' ;add_header 'Access-Control-Allow-Credentials' 'true';add_header 'Access-Control-Allow-Methods' '*';add_header 'Access-Control-Allow-Headers' '*';add_header 'Access-Control-Max-Age' 1728000;proxy_pass http://192.8.3.211:1288;}location /about {root /app/html; #必須要在html目錄中創建一個名為about的目錄才可以訪問,否則報錯。}location /about { #注意about后不要加/ , 使用alias的時候uri后面如果加了斜杠,則下面的路徑配置必須加斜杠,否則403alias /opt/html/about; #當訪問about的時候,會顯示alias定義的/opt/html/about里面的內容。}#注意:location中使用root指令和alias指令的意義不同#root 給定的路徑對應于location中的/uri 左側的/#alias 給定的路徑對應于location中的/uri 的完整路徑#error_page 404 /404.html;#錯誤頁面的文件名稱# redirect server error pages to the static page /50x.html#error_page 500 502 503 504 /50x.html;#錯誤頁面的文件名稱location = /50x.html { #location處理對應的不同錯誤碼的頁面定義到/50x.html,這個跟對應其server中定義的目錄下。root html;#定義默認頁面所在的目錄}}#serverd第二個服務虛擬服務器#訪問http://127.0.0.1:8088/6d.mp4 就可以播放視頻,而視頻6d.mp4就在E:/sh/nginx/nginx目錄下。server {listen 8088;server_name 127.0.0.1;charset utf-8,gbk;#root /usr/local/nginx/html/files; # 你的文件目錄root E:/sh/nginx/nginx; # 你的文件目錄# 顯示目錄,默認不開啟autoindex on;# 顯示文件大小# 顯示文件修改時間autoindex_localtime on;location ~ /.mp4$ {mp4; # 支持mp4mp4_buffer_size 10m;mp4_max_buffer_size 50m;}}#作為下載服務器配置#官方文檔:http://nginx.org/en/docs/http/ngx_http_autoindex_module.html#作為上傳服務器# 定義緩存目錄proxy_cache_path E:/sh/nginx/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m;server {listen 8081;location ~* /.(jpg|jpeg|png|gif)$ {# 開啟緩存功能proxy_cache my_cache;# 指定緩存時間(單位為秒)proxy_cache_valid any 30d;# 如果未命中緩存則從后端服務器獲取并進行緩存#proxy_pass http://backend-server;# 其他相關配置...}location ~* /.(css|js)$ {#1h代表一小時expires 1h;# 開啟緩存功能proxy_cache my_cache;# 指定緩存時間(單位為秒)proxy_cache_valid any 30d;}}
}
9、參考proxy_pass的配置詳解區別
參考代理uri區別文章
到此,單體服務的多種使用場景從不同角度展示出來了,分享告一段落,后面會持續更新,敬請期待!