Nginx调度器
Nginx調度器
HTTP調度
什么是代理服務器
- Nginx除了可以做web服務器(網站)之外還可以做反向代理服務器
- 代理服務器的作用相當于代理人相當于中介
代理服務器的過程
當客戶端訪問代理服務器要頁面的時候,代理服務器沒有頁面沒關系,代理服務器幫你訪問服務器,由后臺服務器把訪問結果交回代理服務器,再由代理服務器把結果傳回給客戶端.這個過程叫做代理服務器
即可以讓外網的用戶訪問到內網的服務器
代理服務器也叫調度器
調度器的作用:負載均衡 健康檢查
負載均衡:將客戶端的并發(fā)訪問量均衡的分配給后臺服務器.對于高并發(fā)量來說,負載均衡就顯得重要
健康檢查: 時不時的檢查后臺服務器的健康狀態(tài).一旦發(fā)現(xiàn)有一臺服務器壞了就不會把客戶端的請求交給它.什么時候這臺服務器修好了就自動的恢復訪問
Nginx目前支持的調度器
7層代理(OSI) 應用層(http網站代理)
4層代理(TCP/UDP) 傳輸層(傳輸協(xié)議代理)
Nginx調度算法
- nginx目前支持的調度算法
輪詢(默認的):逐一調度
weight:指定輪詢幾率,權重值和訪問比率成正比
ip_hash:根據客戶端IP分配固定的后端服務器
服務器組狀態(tài)類型
- 狀態(tài)類型
down:表示當前server暫時不參與負載
max_fails:允許請求失敗的次數(shù)(默認為1)
fail_timeout:max_;fails次失敗后,暫停提供服務的時間(秒)
Nginx反向代理
注意事項:做七層代理修改配置文件一定要在http{}里面配置
Nginx的HTTP調度器
問題
使用Nginx實現(xiàn)Web反向代理功能,實現(xiàn)如下功能:
后端Web服務器兩臺,可以使用httpd實現(xiàn)
Nginx采用輪詢的方式調用后端Web服務器
兩臺Web服務器的權重要求設置為不同的值
最大失敗次數(shù)為1,失敗超時時間為30秒
方案
使用4臺RHEL7虛擬機,其中一臺作為Nginx代理服務器,該服務器需要配置兩塊網卡,IP地址分別為192.168.4.5和192.168.2.5,兩臺Web服務器IP地址分別為192.168.2.100和192.168.2.200。客戶端測試主機IP地址為192.168.4.10
環(huán)境準備:
首先準備四臺虛擬機IP地址分別為:
proxy:192.168.4.5/24(eth0)
Client:192.168.4.10/24(eth0)
web1:192.168.2.100/24(eth1)
web2:192.168.2.200/24(eth1)
步驟一:部署實施后端Web服務器
后端Web服務器可以簡單使用yum方式安裝httpd實現(xiàn)Web服務,為了可以看出后端服務器的不同,可以將兩臺后端服務器的首頁文檔內容設置為不同的內容。(只適合練習環(huán)境使用,生產環(huán)境下兩臺后端服務器的首頁文檔內容應該相同)
2)部署后端Web2服務器
[root@web2 ~]# yum -y install httpd [root@web2 ~]# echo "192.168.2.200" > /var/www/html/index.html [root@web2 ~]# systemctl restart httpd步驟二:配置Nginx服務器,添加服務器池,實現(xiàn)反向代理功能
1)修改/usr/local/nginx/conf/nginx.conf配置文件
2)重起服務
[root@proxy nginx]# /usr/local/nginx/sbin/nginx [root@proxy nginx]# /usr/local/nginx/sbin/nginx -s reload #重起服務 #請先確保nginx是啟動狀態(tài),否則運行該命令會報錯,報錯信息如下: #[error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory) ############################################################################# [root@proxy ~]# /usr/local/nginx/sbin/nginx -v #查看當前nginx的版本 nginx version: nginx/1.12.2 [root@proxy ~]# /usr/local/nginx/sbin/nginx -V #查看當前nginx的詳細信息,模塊等 nginx version: nginx/1.12.2 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC) built with OpenSSL 1.0.2k-fips 26 Jan 2017 TLS SNI support enabled configure arguments: --with-http_ssl_module --with-stream --with-http_stub_status_module3)客戶端使用瀏覽器訪問代理服務器測試輪詢效果
[root@client ~]# curl http://192.168.4.5 #使用該命令多次訪問 192.168.2.100 [root@client ~]# curl http://192.168.4.5 #使用該命令多次訪問 192.168.2.200 出現(xiàn)的效果為輪詢效果. 調度器帶健康檢查功能,當web服務器其中一臺壞掉了,就會自動停止訪問 下面以web1作為示例: [root@web1 ~]# systemctl stop httpd [root@client ~]# curl 192.168.4.5 192.168.2.200 [root@client ~]# curl 192.168.4.5 192.168.2.200 [root@client ~]# curl 192.168.4.5 192.168.2.200 由于實驗中只用了兩臺web,所以停止web1服務,客戶端還是能正常訪問,沒有任何感覺步驟二:配置upstream服務器集群池屬性
1)設置失敗次數(shù),超時時間,權重
weight可以設置后臺服務器的權重,max_fails可以設置后臺服務器的失敗次數(shù),fail_timeout可以設置后臺服務器的失敗超時時間。
2)重新加載配置
[root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload #請先確保nginx是啟動狀態(tài),否則運行該命令會報錯,報錯信息如下: #[error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)步驟三:配置upstream服務器集群的調度算法
1)設置相同客戶端訪問相同Web服務器
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf .. .. http { .. .. upstream webserver { #通過ip_hash設置調度規(guī)則為:相同客戶端訪問相同服務器ip_hash;server 192.168.2.100 weight=1 max_fails=2 fail_timeout=10;server 192.168.2.200 weight=2 max_fails=2 fail_timeout=10;} .. .. server {listen 80;server_name www.tarena.com;location / {proxy_pass http://webserver;} }2)重新加載配置
root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload #請先確保nginx是啟動狀態(tài),否則運行該命令會報錯,報錯信息如下: #[error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)3 ) 客戶端使用瀏覽器訪問代理服務器測試輪詢效果
[root@client ~]# curl http://192.168.4.5 //使用該命令多次訪問查看效果TCP/UDP調度
模塊
- ngx_stream_core_module模塊
- 使用==–with-stream==開啟該模塊
注意:
nginx從1.9版本才開始支持該功能
語法格式
注意事項:做四層代理修改配置文件一定要在在http{}外面配置
問題
使用Nginx實現(xiàn)TCP/UDP調度器功能,實現(xiàn)如下功能:
后端SSH服務器兩臺
Nginx編譯安裝時需要使用–with-stream,開啟ngx_stream_core_module模塊
Nginx采用輪詢的方式調用后端SSH服務器
方案
使用4臺RHEL7虛擬機,其中一臺作為Nginx代理服務器,該服務器需要配置兩塊網卡,IP地址分別為192.168.4.5和192.168.2.5,兩臺SSH服務器IP地址分別為192.168.2.100和192.168.2.200。客戶端測試主機IP地址為192.168.4.10。如圖-2所示。
步驟一:部署支持4層TCP/UDP代理的Nginx服務器
1)部署nginx服務器
編譯安裝必須要使用–with-stream參數(shù)開啟4層代理模塊。
2 ) 修改nginx的配置文件
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf16 stream {17 upstream backend {18 server 192.168.2.100:22; //后端SSH服務器的IP和端口19 server 192.168.2.200:22;20 }21 server {22 listen 12345; //Nginx監(jiān)聽的端口,不要使用22端口,會產生端口的沖突23 proxy_pass backend; 24 }25 } 26 27 http {28 include mime.types;29 ......端口沖突
網絡原則: IP地址對應唯一的一臺主機,端口對應唯一的一個服務
當兩個服務都想霸占一個端口時會產生沖突
3 ) 重起服務
[root@proxy ~]# /usr/local/nginx/sbin/nginx [root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload #請先確保nginx是啟動狀態(tài),否則運行該命令會報錯,報錯信息如下: #[error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)4 ) 客戶端使用訪問代理服務器測試輪詢效果
[root@client ~]# ssh 192.168.4.5 //如果不指定-p選項,則默認進入22端口,進入到proxy [root@proxy ~]# [root@client ~]# ssh 192.168.4.5 -p 12345 //根據輪詢的原則顯示 [root@web1 ~]# exit [root@client ~]# ssh 192.168.4.5 -p 12345 [root@web2 ~]# exitNginx常見問題處理
問題
本案例要求對Nginx服務器進行適當優(yōu)化,解決如下問題,以提升服務器的處理性能:
- 如何自定義返回給客戶端的404錯誤頁面
- 如何查看服務器狀態(tài)信息
- 如果客戶端訪問服務器提示“Too many open files”如何解決
- 如何解決客戶端訪問頭部信息過長的問題
- 如何讓客戶端瀏覽器緩存數(shù)據
客戶機訪問此Web服務器驗證效果:
- 使用ab壓力測試軟件測試并發(fā)量
- 編寫測試腳本生成長頭部信息的訪問請求
- 客戶端訪問不存在的頁面,測試404錯誤頁面是否重定向
自定義報錯頁面
1)優(yōu)化前,客戶端使用瀏覽器訪問不存在的頁面,會提示404文件未找到
[root@client ~]# firefox http://192.168.4.5/xxxxx //訪問一個不存在的頁面 <html> <head><title>404 Not Found</title></head> <body bgcolor="white"> <center><h1>404 Not Found</h1></center> <hr><center>nginx/1.12.2</center> </body> </html>2 ) 修改Nginx配置文件,自定義報錯頁面
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf .. ..charset utf-8; //僅在需要中文時修改該選項 error_page 404 /404.html; //自定義錯誤頁面 .. .. [root@proxy ~]# vim /usr/local/nginx/html/404.html //生成錯誤頁面 偶買噶,沒有頁面啦 [root@proxy ~]# usr/local/nginx/sbin/nginx -s reload #請先確保nginx是啟動狀態(tài),否則運行該命令會報錯,報錯信息如下: #[error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)3 ) 優(yōu)化后,客戶端使用瀏覽器訪問不存在的頁面,會提示自己定義的40x.html頁面
[root@client ~]# firefox 192.168.4.5/udhuishdi常見的http代碼
| 100 | 請求已接收,客戶端可以繼續(xù)發(fā)送請求 |
| 101 | Switching Protocals 服務器根據客戶端的請求切換協(xié)議 |
| 200 | 一切正常 |
| 201 | 服務器已經創(chuàng)建了文檔 |
| 202 | 服務器已接收了請求,但處理尚未完成 |
| 203 | 文檔正常返回,但一些頭部信息可能不正確 |
| 300 | 客戶端請求的資源可以在多個位置找到 |
| 301 | 永久重定向 |
| 302 | 臨時重定向 |
| 305 | 使用代理服務 |
| 400 | 請求語法錯誤 |
| 401 | 用戶名或密碼錯誤,客戶被拒絕 |
| 401.1 | 登錄失敗 |
| 403 | 禁止訪問(客戶端IP地址被拒絕) |
| 404 | 文件不存在 |
| 406 | 指定資源已找到,但MIME類型與客戶端要求不兼容 |
| 406.6 | IP地址被拒絕 |
| 403. | 9用戶數(shù)過多 |
| 414 | 請求URL頭部過長 |
| 500 | 服務器內部錯誤 |
| 501 | 服務器不支持客戶端的請求功能 |
| 502 | Bad Gateway網關錯誤,一般是做了集群,找不著后臺服務器,服務器作為網關或者代理時,為了完成請求訪問下一個服務器,當該服務器返回了非法應答 |
| 503 | 服務不可用 |
| 504 | 網關超時,服務器處于維護或者負載過高無法響應 |
| 505 | 服務器不支持客戶端請求的HTTP版本 |
返回狀態(tài)碼規(guī)律
- 200開頭代表一切正常
- 300開頭代表重定向
- 400開頭代表客戶端問題
- 500開頭代表服務器內部問題
查看服務器的狀態(tài)信息
如何查看服務器狀態(tài)信息(非常重要的功能)
1)編譯安裝時使用–with-http_stub_status_module開啟狀態(tài)頁面模塊
再次重新編譯安裝nginx
2)啟用Nginx服務并查看監(jiān)聽端口狀態(tài)
ss命令可以查看系統(tǒng)中啟動的端口信息,該命令常用選項如下:
-a顯示所有端口的信息
-n以數(shù)字格式顯示端口號
-t顯示TCP連接的端口
-u顯示UDP連接的端口
-l顯示服務正在監(jiān)聽的端口信息,如httpd啟動后,會一直監(jiān)聽80端口
-p顯示監(jiān)聽端口的服務名稱是什么(也就是程序名稱) 注意:在RHEL7系統(tǒng)中可以使用ss命令替代netstat命令,功能一樣,選項一樣。
3 ) 修改nginx配置文件
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf35 server {36 listen 80;37 server_name localhost;38 39 location /status { #如果用戶要訪問status,那么40 stub_status on;# allow IP地址(管理員IP)# deny ip地址(all) #只允許管理員查看狀態(tài)41 } [root@proxy ~]# /usr/local/nginx/sbin/nginx [root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload4)優(yōu)化后,查看狀態(tài)頁面信息
[root@proxy ~]# curl http://192.168.4.5/status Active connections: 1 server accepts handled requests 1 1 1 Reading: 0 Writing: 1 Waiting: 0
Active connections:當前活動的連接數(shù)量。
Accepts Handled Requests:服務端已經接受客戶端連接總數(shù)和已經處理客戶端的連接總數(shù)
(一般與accepts一致,除非服務器限制了連接數(shù)量)。
數(shù)量只會增高. 重啟nginx的時候會重置為0.
第一個數(shù)字代表客戶端發(fā)送多少次請求連接
第二個數(shù)字代表服務端處理了多少次客戶端的請求
第三個數(shù)字代表網頁點擊量,刷新一次要一次頁面
Reading:當前服務器正在讀取客戶端請求頭的數(shù)量。
Writing:當前服務器正在寫響應信息的數(shù)量。
Waiting:當前多少客戶端在等待服務器的響應。
優(yōu)化Nginx并發(fā)量
1)優(yōu)化前使用ab高并發(fā)測試
[root@proxy ~]# ab -n 2000 -c 2000 http://192.168.4.5/ Benchmarking 192.168.4.5 (be patient) socket: Too many open files (24) //提示打開文件數(shù)量過多2 )修改Nginx配置文件,增加并發(fā)量
[root@proxy ~]# lscpu CPU(s): 2 #雙核 [root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf .. .. worker_processes 2; //與CPU核心數(shù)量一致 events { worker_connections 65535; //每個worker最大并發(fā)連接數(shù),理論值5萬#這兩行的兩個參數(shù)與并發(fā)量有關#端口號最大數(shù): 65535 } .. .. [root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload3)優(yōu)化Linux內核參數(shù)(最大文件數(shù)量,1024)
[root@proxy ~]# ulimit -a //查看所有屬性值open files (-n) 1024 //最多開多少文件max user processes (-u) 5569 //最多開多少程序 [root@proxy ~]# ulimit -Hn 100000 //設置硬限制(臨時規(guī)則) [root@proxy ~]# ulimit -Sn 100000 //設置軟限制(臨時規(guī)則) [root@proxy ~]# ulimit -a //再次查看open files (-n) 100000 [root@proxy ~]# ab -c 2000 -n 2000 http://192.168.4.5/ //再次查看,此時就可以直接看到回復[root@proxy ~]# vim /etc/security/limits.conf.. .. * soft nofile 100000 * hard nofile 100000 #該配置文件分4列,分別如下: #用戶或組 硬限制或軟限制 需要限制的項目 限制的值4)優(yōu)化后測試服務器并發(fā)量(因為客戶端沒調內核參數(shù),所以在proxy測試)
[root@proxy ~]# ab -n 2000 -c 2000 http://192.168.4.5/優(yōu)化Nginx數(shù)據包頭緩存
1)優(yōu)化前,使用腳本測試長頭部請求是否能獲得響應
[root@proxy ~]# ls /opt/lnmp_soft/buffer.sh /opt/lnmp_soft/buffer.sh [root@proxy ~]# cd /opt/lnmp_soft/ [root@proxy lnmp_soft]# ./buffer.sh <html> <head><title>414 Request-URI Too Large</title></head> ##出現(xiàn)414報錯 <body bgcolor="white"> <center><h1>414 Request-URI Too Large</h1></center> ##提示URI地址欄頭部信息過大 <hr><center>nginx/1.12.2</center> </body> </html>2 ) 修改Nginx配置文件,增加數(shù)據包頭部緩存大小
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf .. .. http { client_header_buffer_size 1k; //默認請求包頭信息的緩存 large_client_header_buffers 4 4k; //大請求包頭部信息的緩存?zhèn)€數(shù)與容量,4個乘4k .. .. } [root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload3)優(yōu)化后,使用腳本測試長頭部請求是否能獲得響應
[root@proxy lnmp_soft]# ./buffer.sh <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style>body {width: 35em;margin: 0 auto;font-family: Tahoma, Verdana, Arial, sans-serif;} </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p><p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p><p><em>Thank you for using nginx.</em></p> </body> </html>瀏覽器本地緩存靜態(tài)數(shù)據
1)使用Firefox瀏覽器查看緩存
以Firefox瀏覽器為例,在Firefox地址欄內輸入about:cache將顯示Firefox瀏覽器的緩存信息,如圖-3所示,點擊List Cache Entries可以查看詳細信息。
disk (目前緩存的信息有多少)
Number of entries: 緩存數(shù)
Maximum storage size: 最大緩存
Storage in use: 緩存大小
Storage disk location: 緩存路徑
List Cache Entries 查看曾經緩存的資料
2)清空firefox本地緩存數(shù)據,如圖-4所示。
3)修改Nginx配置文件,定義對靜態(tài)頁面的緩存時間
4)優(yōu)化后,使用Firefox瀏覽器訪問圖片,再次查看緩存信息
[root@client ~]# firefox http://192.168.4.5/day.jpg總結
- 上一篇: LNMP动态网站
- 下一篇: Session与Cookie