您好,登錄后才能下訂單哦!
小編給大家分享一下Nginx工作模式及代理配置的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
單進程模式下,Nginx 啟動后只有一個進程,Nginx 的所有工作都由這個進程負責。
優點:
單進程模式由于只有一個進程,因此可以很方便的利用 gdb
等工具進行調試。
缺點:
單進程模式不支持 Nginx 的平滑升級功能,任何的信號處理都可能造成服務中斷;并且由于是單進程,進程掛掉后,在沒有外部監控的情況下,無法重啟服務。
不過后面 Nginx 已經將 Master-Worker 配置成默認的工作模式,所以并不需要擔心上面的問題。
[root@localhost ~]# ps aux | grep nginx | grep -v grep root 38395 0.0 0.0 264704 7192 ? Ss Dec15 0:00 nginx: master process /usr/local/nginx/sbin/nginx root 3421689 0.0 0.0 294040 32680 ? S Dec24 0:00 nginx: worker process
Nginx 啟動后,會有一個 Master 進程和至少一個的 Worker 進程;Master 進程主要負責處理系統信號,加載配置,管理 Worker 進程等操作;而 Worker 進程則是負責處理具體的業務邏輯,也就是說,對外部來說,真正提供服務的是 Worker 進程。
優點: 穩定性高,只要還有 Worker 進程存活,就能夠提供服務,并且一個 Worker 進程掛掉后,Master 進程會立即啟動一個新的 Worker 進程,來保證 Worker 進程數量不變,降低服務中斷的概率;同時 可以配合 Nginx 的 CPU 親和,來充分利用多核 CPU 的優勢,提升性能。
前兩天博主在啟動 Nginx 的時候,是沒有問題的,但是在訪問時就不行,當時通過查看端口號,發現端口是存在的,后面使用 ps
看進程,發現只有一個 master
進程(master
進程不會對外提供服務),最后通過查看 error.log
日志發現:
是因為使用的第三方模有問題,導致 Worker 進程并未啟動。
處理方案的話有兩種: 第一個就是將第三方模塊在配置中進行移除,第二個就是對第三方模塊進行修復。
這里博主 主要介紹:Nginx 配置文件中 /
的作用,別看這個一個小小的符號,他的作用可以說 關乎到系統是否可以正常提供服務。
Nginx 配置文件中 /
的作用,主要體現在 proxy_pass
的配置上。
準備工作:
[root@PengYuYan ~]# yum -y install nginx [root@PengYuYan ~]# cat <<END > /etc/nginx/conf.d/Server_80.conf server { listen 80; server_name 127.0.0.1; root /usr/share/nginx/html; index index.html; location /ZhangSan/ { proxy_pass http://127.0.0.1:8080; } location /PengYuYan/ { proxy_pass http://127.0.0.1:8080/; } } END [root@PengYuYan ~]# mkdir /usr/share/nginx/html/ZhangSan [root@PengYuYan ~]# echo "This is 127.0.0.1:80 ZhangSan" > /usr/share/nginx/html/ZhangSan/index.html [root@PengYuYan ~]# mkdir /usr/share/nginx/html/PengYuYan [root@PengYuYan ~]# echo "This is 127.0.0.1:80 PengYuYan" > /usr/share/nginx/html/PengYuYan/index.html
[root@PengYuYan ~]# cat <<END > /etc/nginx/conf.d/Server_8080.conf server { listen 8080; server_name 127.0.0.1; root /www/html; index index.html; location / { } location /ZhangSan/ { } location /PengYuYan/ { } } END [root@PengYuYan ~]# mkdir -p /www/html [root@PengYuYan ~]# echo "This is 127.0.0.1:8080 /" > /www/html/index.html [root@PengYuYan ~]# mkdir /www/html/ZhangSan [root@PengYuYan ~]# echo "This is 127.0.0.1:8080 ZhangSan" > /www/html/ZhangSan/index.html [root@PengYuYan ~]# mkdir /www/html/PengYuYan [root@PengYuYan ~]# echo "This is 127.0.0.1:8080 PengYuYan" > /www/html/PengYuYan/index.html
下面的那些 location
,你們是不需要重新配置的,因為上面的配置和下面對應。
location /PengYuYan/ { proxy_pass http://127.0.0.1/8080/; }
驗證:curl 127.0.0.1/PengYuYan/
這里博主來分解一下:
我們 curl 127.0.0.1/PengYuYan/ 中的 PengYuYan 其實就是我們 80 端口的 location 配置,并不是 8080 端口上的配置;
而我們正好又在 proxy_pass 代理的后面增加了個 /,就導致我們實際上訪問的是 curl 127.0.0.1:8080/;
也就是說,我們要是如上配置,想要訪問到 8080 端口的 PengYuYan,則需要 curl 127.0.0.1/PengYuYan/PengYuYan/。
location /PengYuYan/ { proxy_pass http://127.0.0.1/8080/; }
驗證:
這個其實很好理解,因為我們沒有在 proxy_pass
后面增加 /
,所以 Nginx 會自動將 location
的目錄放到 proxy_pass
后面。
總結:
當我們的 proxy_pass
代理后面有 /
時,它并不會將 location
配置的目錄加進去;
而當我們的代理后面沒有加 /
時,Nginx 便會將 location
的目錄放到 proxy_pass
后面。
1) 在帶有目錄的情況下加 /
(修改原來的 Server_80.conf
文件即可)
location /PengYuYan/ { proxy_pass http://127.0.0.1/8080/; }
驗證:
2) 在帶有目錄的情況下不加 /
location /ZhangSan/ { proxy_pass http://127.0.0.1/8080/ZhangSan; }
驗證:curl 127.0.0.1/ZhangSan/
,在我們的配置上,實際上是訪問的 curl 127.0.0.1:8080/ZhangSan/ZhangSan/
其實啊,不管是有目錄和沒目錄,都和博主上面總結的一樣。主要還是 Nginx 中的 /
在作怪。
以上是“Nginx工作模式及代理配置的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。