CentOS6.7使用nginx提供靜態資源服務,反向代理和負載均衡
1. nginx 的簡單原理
nginx是一個高性能的HTTP和反向代理服務器,也是一個IMAP/POP3/SMTP服務器。其特點是占用內存少,並發能力強。
如果使用nginx作為web服務器,那麽nginx收到請求後將請求內容響應到客戶端。如果使用nginx作為代理服務器,那麽nginx收到請求後將請求轉發到應用服務器(如tomcat),應用服務器處理完請求後將請求發送給nginx,然後nginx再將響應內容發送給客戶端。
nginx是多進程架構,有一個主進程和若幹個工作進程。主進程主要用來讀取並檢測配置文件,管理工作進程。工作進程用來處理客戶端請求。nginx采用基於事件的模型和獨立於操作系統的機制來高效地將請求分發到工作進程。
2. nginx 的安裝
nginx可以使用yum源安裝或者直接下載安裝包,這裏采用最簡便的yum源安裝,直接執行如下指令:
1 yum install nginx -y
安裝完成後,打開nginx,使用yum源安裝nginx,會自動將nginx配置乘service,執行以下指令即可打開nginx:
1 service nginx start
訪問遠程服務器的域名或IP即可看到nginx歡迎頁面
3. nginx提供靜態資源服務
nginx的一大經典使用場景就是提供靜態資源服務,假設/var/www/html是靜態資源所在的文件夾,那麽可以通過修改配置文件來通過nginx處理這些靜態資源。
nginx的默認配置文件在/etc/nginx/nginx.conf:
1 # For more information on configuration, see: 2 # * Official English Documentation: http://nginx.org/en/docs/ 3 # * Official Russian Documentation: http://nginx.org/ru/docs/ 4 5 user nginx; 6 worker_processes auto; 7 error_log /var/log/nginx/error.log; 8 pid /var/run/nginx.pid; 9 10 # Load dynamic modules. See /usr/share/nginx/README.dynamic.11 include /usr/share/nginx/modules/*.conf; 12 13 events { 14 worker_connections 1024; 15 } 16 17 18 http { 19 log_format main ‘$remote_addr - $remote_user [$time_local] "$request" ‘ 20 ‘$status $body_bytes_sent "$http_referer" ‘ 21 ‘"$http_user_agent" "$http_x_forwarded_for"‘; 22 23 access_log /var/log/nginx/access.log main; 24 25 sendfile on; 26 tcp_nopush on; 27 tcp_nodelay on; 28 keepalive_timeout 65; 29 types_hash_max_size 2048; 30 31 include /etc/nginx/mime.types; 32 default_type application/octet-stream; 33 34 # Load modular configuration files from the /etc/nginx/conf.d directory. 35 # See http://nginx.org/en/docs/ngx_core_module.html#include 36 # for more information. 37 include /etc/nginx/conf.d/*.conf; 38 }
通過最後一行代碼可以看到nginx.conf還導入了/etc/nginx/conf.d/*.conf裏面的配置,可以在/etc/nginx/conf.d/default.conf中找到server配置代碼(windows的配置文件路徑是“nginx文件夾/conf/nginx.conf”):
1 server { 2 listen 80; 3 #listen [::]:80 default_server; 4 server_name _; 5 root /usr/share/nginx/html; 6 7 # Load configuration files for the default server block. 8 include /etc/nginx/default.d/*.conf; 9 10 location / { 11 } 12 13 error_page 404 /404.html; 14 location = /40x.html { 15 } 16 17 error_page 500 502 503 504 /50x.html; 18 location = /50x.html { 19 } 20 }
然後開始配置靜態資源服務器,在location / {}後面新增一個location配置:
1 location / { 2 } 3 4 location /html { 5 root /var/www; 6 index index.html; 7 }
保存文件後運行以下指令重新加載nginx以使配置生效:
1 service nginx reload
因為nginx是通過絕對路徑訪問靜態資源的,所以訪問http://www.test.cn/html (www.test.cn是遠程服務器的域名或IP,後文會一直用來代替)會指向文件夾/var/www/html。
如果希望打開/var/www/html/test/index.html,則可以訪問http://www.test.cn/html/test,不需要在路徑上加上index.html,因為location中配置了index index.html。
location還支持正則表達式,我們可以用正則表達式來匹配html、css、js、png、jpg、gif、ico這些為擴展名的請求:
1 location ~* \.(html|css|js|png|jpg|gif|ico)$ { 2 root /var/www; 3 }
4. nginx反向代理
nginx的另一大經典使用場景就是作為反向代理服務器將對應的請求轉發到應用服務器處理然後將應用服務器的響應內容返回給客戶端。
通過配置location可以將客戶端請求轉發到配置的地址,先將tomcat的端口設置為8080(默認),然後打開tomcat。訪問http://www.test.cn:8080可以打開tomcat歡迎頁,然後配置nginx:
1 location / { 2 #轉發的應用服務器路徑 3 proxy_pass http://localhost:8080; 4 } 5 6 location /html { 7 root /var/www; 8 index index.html; 9 }
執行重新加載nginx指令後再次訪問http://www.test.cn ,發現nginx的歡迎頁面變成了tomcat的歡迎頁面。
這就是最簡單的反向代理。
5. nginx負載均衡
上面演示了如何反向代理,但是如果請求量過大的時候,一臺應用服務器顯然是不能滿足需求的,所以就需要多臺服務器來實現負載均衡。
首先將apache的端口設置為8082,然後執行打開apache指令(沒有的請自行安裝,這裏不再贅述):
1 service httpd start
然後修改nginx配置:
1 upstream local_servers { 2 server localhost:8080 weight=1; 3 server localhost:8082 weight=1; 4 } 5 6 location / { 7 #轉發的應用服務器路徑 8 proxy_pass http://local_servers; 9 } 10 11 location /html { 12 root /var/www; 13 index index.html; 14 }
upstream是nginx的Http Upstream模塊,這個模塊通過一個簡單的調度算法來實現客戶端IP到後端服務器的負載均衡。在上面的設定中,通過upstream指定了一個負載均衡器的名稱local_servers,這個名稱可以任意指定,在後面需要用到的時候直接調用就可以了。
重新加載nginx後再多次訪問http://www.test.cn ,發現tomcat和apache的歡迎頁面都會出現,出現的頻率大概是1:1。這就是upstream中weight的作用,表示weight表示權重,權重越大,請求轉發到這個地址的概率就越大。
nginx的負載均衡目前支持4種調度算法,其中後兩項屬於第三方調度算法:
- 輪詢(默認)。每個請求按時間順序分別分配到不同的後端服務器,如果一個後端服務器宕機,會被自動剔除,使用戶訪問不受影響。weight代表輪詢權值,值越大,表示被訪問的概率越高,通常用於多臺後端服務器性能不均的情況下。
- ip_hash。每個請求按IP的hash結果分配,這樣同一個IP固定訪問同一個後端服務器。貌似可以解決集群情況下session共享的問題,但個人認為不是理想的解決方式,當一臺後端服務器宕機時,當前訪客並不能無縫切換到其他後端服務器。
- fair。這是比上面兩個負載均衡算法更加智能的算法,此算法可以根據頁面大小和加載時間長短智能地進行負載均衡,也就是根據後端服務器的響應時間來分配請求,響應時間短的優先分配。nginx本身是不支持fair的,如果需要使用fair算法,需要先下載nginx的upstream_fair模塊。
- url_hash。此方法按訪問url的hash結果來分配請求,使同一個url定位到同一個後端服務器,可以進一步提高後端緩存服務器的效率。nginx本身是不支持url_hash的,如果需要使用該算法,需要先下載nginx的hash軟件包。
在Http Upstream模塊中,可以通過server指令指定參與負載均衡的後端服務器的IP和端口,同時還可以設定每個後端服務器在負載均衡調度中的狀態。常用的狀態有:
- down,表示當前的server暫時不參與負載均衡。
- backup,預留的備用機器,當所有的非backup機器都故障或者正忙時才調用這臺機器,因此這臺機器的壓力最輕。
- max_fails,允許請求失敗的次數,默認為1。當超過最大次數時,返回proxy_next_upstream模塊定義的錯誤。
- fail_timeout,在經歷了max_fails次失敗後,暫停服務fail_timeout秒,max_fails和fail_timeout一起使用。
當負載均衡算法為ip_hash時,後端服務器在負載均衡調度中的狀態不能為weight和backup。
本文轉載自:https://blog.csdn.net/z406245159/article/details/72821285
CentOS6.7使用nginx提供靜態資源服務,反向代理和負載均衡