Nginx實現HTTP和WebSocket的反向代理


一、前言

在上一篇博客IIS實現HTTP和WebSocket服務的反向代理中已經介紹了什么是反向代理以及如何通過IIS實現反向代理,但IIS畢竟受環境的限制,接下來給大家介紹另一種方式使用Nginx實現反向代理。

關於Nginx大家可以參考我另一篇博客:Nginx一個很好用的“服務器”

二、HTTP的反向代理

第一步、准備一個能訪問的站點。

例如:我在IIS建了一個站點,里面只有一個test.html文件,里面是一句話“Hello World”,IIS上的訪問地址為:http://localhost:5106/test.html,現在我要利用Nginx實現反向代理,通過訪問http://localhost:8889/test.html然后跳轉到5106。

第二步、打開conf/nginx.conf文件進行配置,配置可以參考:

#在nginx.conf的注釋符號位#
#每個指令必須有分號結束

#user nobody; worker_processes 2;  #允許生成的進程數,默認為1,建議設置為等於CPU總核心數 pid D:/MyJob/Projects/nginx-1.17.5/pid/nginx.pid; #指定nginx進程運行文件存放地址,注意路徑別寫錯了,如果不想要這個配置就在前面加#號 error_log logs/error.log debug;  #日志路徑 events { accept_mutex on;  #設置網路連接序列化,防止驚群現象發生,默認為on,驚群現象:一個網路連接到來,多個睡眠的進程被同時叫醒,但只有一個進程能獲得鏈接,這樣會影響系統性能 multi_accept on;  #設置一個進程是否同時接受多個網絡連接,默認為off worker_connections 1024;  #單個進程最大連接數(最大連接數=連接數*進程數),根據硬件調整,和前面工作進程配合起來用,盡量大,但是別把cpu跑到100%就行。每個進程允許的最多連接數,理論上每台nginx服務器的最大連接數為 } http { include mime.types;  #文件擴展名與文件類型映射表 default_type application/octet-stream;  #默認文件類型,默認為text/plain #自定義日志格式
   log_format myFormat '$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 myFormat; sendfile on;  #允許開啟高效文件傳輸模式方式傳輸文件,默認為off server { keepalive_requests 120; #單連接請求上限次數。 listen 8889; #監聽端口 server_name localhost; #監聽地址 location / {    proxy_pass http://localhost:5106; #被代理的地址
        proxy_http_version 1.1; } } }

第三步、啟動Nginx

cmd 進入Nginx解壓目錄 執行以下命令

注:這里教大家一個小技巧,cmd 進入Nginx解壓目錄時一般我們需要打開cmd,然后在cd 目錄,其實們可以在目錄的地址欄直接輸入cmd然后回車即可快速打開cmd,如下圖:

 (1)執行命令:nginx -t -c conf/nginx.conf 測試nginx配置文件是否正確,當出現如下提示時說明你的配置文件是正確的,否則自行根據提示進行錯誤修復。

 (2)執行命令:start nginx 或者雙擊nginx.exe 啟動nginx,啟動后我們可以在任務管理中看到nginx的進程,如下圖:

(3)如果有看到上面的進程的話說明我們啟動成功了,這時候我們訪問 http://localhost:8889/test.html 試試看能不能正常顯示出“Hello World”,如下圖

出現上面的情況說明我們順利的將8889跳轉到了5106。

三、WebSocket的反向代理

NGINX從1.3開始支持WebSocket。

NGINX最多只能維持(65535*后端服務器IP個數)條WebSocket的長連接,如果后端WebSocket服務器IP只有一個,那么就只能最多支持65535條連接。

配置nginx 即支持WebSocket的反向代理。在server -> location中使用這兩句開啟Nginx對WebSocket的支持功能:

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

例如:

server {
    listen 80;
    location / {
                    proxy_pass http://localhost:6000;
                    proxy_http_version 1.1;
                    proxy_set_header Upgrade $http_upgrade;
                    proxy_set_header Connection "upgrade";
            }
 
}

利用nginx代理websocket的時候,發現客戶端和服務器握手成功后,如果在60s時間內沒有數據交互,連接就會自動斷開。

為了保持長連接,可以采取以下這種方式:

nginx.conf 文件里location 中的 proxy_read_timeout 默認60s斷開,可以把他設置大一點,你可以設置成自己需要的時間,我這里設置的是十分鍾(600s)。
例如:

server {
    listen 80;
    location / {
                    proxy_pass http://localhost:6000;
                    proxy_http_version 1.1;
                    proxy_set_header Upgrade $http_upgrade;
                    proxy_set_header Connection "upgrade";
                    proxy_read_timeout 600s; 
            }
}            

四、Nginx常用命令

1、啟動:

D:\MyJob\Projects\nginx-1.17.5>start nginx

D:\MyJob\Projects\nginx-1.17.5>nginx.exe

注:建議使用第一種,第二種會使你的cmd窗口一直處於執行中,不能進行其他命令操作。

2、停止:

D:\MyJob\Projects\nginx-1.17.5>nginx -s stop

D:\MyJob\Projects\nginx-1.17.5>nginx -s quit

注:stop是快速停止nginx,可能並不保存相關信息;quit是完整有序的停止nginx,並保存相關信息。

3、重新載入Nginx:

D:\MyJob\Projects\nginx-1.17.5>nginx -s reload

當配置信息修改,需要重新載入這些配置時使用此命令。

4、重新打開日志文件:

D:\MyJob\Projects\nginx-1.17.5>nginx -s reopen

5、查看Nginx版本:

D:\MyJob\Projects\nginx-1.17.5>nginx -v

大家在看的時候不用擔心怎么這么多會不會看不懂,其實並沒有很復雜,用着用着就會了,而且一些簡單的應用並不會用到上面的所有配置

基本概念就介紹到這了,下一篇教大家如何實際應用nginx。

6、驗證配置文件是否正確

D:\MyJob\Projects\nginx-1.17.5>nginx -t -c conf/nginx.conf


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM