第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

Nginx反向代理(下)

本小節(jié),我們繼續(xù)學習 Nginx 在 七層反向代理中的其它幾種比較常見的情況,比如 web 服務中的 WebSocket 協(xié)議的反向代理和 uwsgi 協(xié)議的反向代理。

1. WebSocket的反向代理

WebSocket 是目前比較成熟的技術(shù)了, WebSocket 協(xié)議為創(chuàng)建客戶端和服務器端需要實時雙向通訊的 webapp 提供了一個選擇。服務器可以向瀏覽器推送相關(guān)消息,這樣在前端實現(xiàn)的某個頁面中我們可以及時看到服務器的狀態(tài)變化而不用使用定時刷新去獲取后臺信息。目前大部分瀏覽器都支持 WebSocket 協(xié)議,比如 Firefox,IE,Chrome,Safari,Opera,并且越來越多的服務器框架現(xiàn)在也同樣支持 WebSocket。此外,在js、java 和 python 中都提供了 Websocket 開發(fā)庫,這也使得 websocket 協(xié)議的廣泛應用于 web 服務的開發(fā)中。當然作為瀏覽器和后臺服務的中間代理的 Nginx 也必定支持 Websocket,這樣能更好的完成代理角色。在 Nginx 中通過 ngx_http_proxy_module 模塊實現(xiàn) Websocket 反向代理功能,具體實現(xiàn)配置如下:

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

上述配置表示將轉(zhuǎn)發(fā)的協(xié)議提升至1.1, 同時在轉(zhuǎn)發(fā)的 http 請求的頭部中加上如下配置:

Upgrade: websocket
Connection: upgrade

這兩個字段表示請求服務器升級協(xié)議為 WebSocket。上游服務器處理完請求后,響應如下報文:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: upgrade

這個響應是告訴客戶端已成功切換協(xié)議,升級為 Websocket 協(xié)議。握手成功之后,服務器端和客戶端便角色對等,就像普通的 Socket 一樣,能夠雙向通信。 不再進行 HTTP 的交互,而是開始 WebSocket 的數(shù)據(jù)幀協(xié)議實現(xiàn)數(shù)據(jù)交換。默認情況下,連接將會在無數(shù)據(jù)傳輸60秒后關(guān)閉,proxy_read_timeout 參數(shù)可以延長這個時間。源站通過定期發(fā)送 ping 幀以保持連接并確認連接是否還在使用。

通過以上簡簡單單的三行配置,我們就能在 Nginx 中輕松實現(xiàn) Websocket 的反向代理,這也說明了 Nginx 的簡單易用特點。

2. uwsgi的反向代理

首先,理清楚幾個概念:

  • WSGI:全稱是 Web Server Gateway Interface,WSGI 只是一種規(guī)范,描述 web server 如何與 web application 通信的規(guī)范。要實現(xiàn) WSGI 協(xié)議,必須同時實現(xiàn) web server 和 web application,當前運行在 WSGI 協(xié)議之上的 web 框架有 Flask, Django,這也是目前最流行的 python web框架。
  • uwsgi:與WSGI一樣是一種通信協(xié)議,是uWSGI服務器的獨占協(xié)議,用于定義傳輸信息的類型(type of information),每一個uwsgi packet前4byte為傳輸信息類型的描述。
  • uWSGI:是一個web服務器,實現(xiàn)了WSGI協(xié)議、uwsgi協(xié)議、http協(xié)議等。

WSGI 協(xié)議其實是定義了一種 server 與 application 解耦的規(guī)范,即可以有多個實現(xiàn) WSGI server 的服務器,也可以有多個實現(xiàn) WSGI application 的框架,那么就可以選擇任意的 server 和 application 組合實現(xiàn)自己的 web 應用。Django,F(xiàn)lask 框架都有自己實現(xiàn)的簡單的WSGI server,一般用于服務器調(diào)試,生產(chǎn)環(huán)境下直接使用WSGI server。

Nginx 中將 http 協(xié)議的報文轉(zhuǎn)換成 uwsgi 協(xié)議的報文,只需要使用 uwsgi_pass 指令即可。和 proxy_pass 指令類似,前者轉(zhuǎn)發(fā)為 uwsgi 協(xié)議的報文,后者代理轉(zhuǎn)發(fā) http 協(xié)議的報文。其余用法一致。

Syntax:	uwsgi_pass [protocol://]address;
Default:Context: location, if in location

用法示例:

...

http {
    ...
    server {
        listen 9000;
        
        location / {
            # 包含uwsgi請求描述文件
            include uwsgi_params;
            # 配置請求傳遞,socket地址
            uwsgi_pass 127.0.0.1:9000;
        }
    }
    ...
}
...

3. 案例測試

3.1 Websocket 反向代理

我們打開百度搜索"websocket在線測試",找到 websocket 的在線測試網(wǎng)站。

圖片描述

可以看到 121.40.165.18:8800 是該網(wǎng)站提供 websocket 連接的后端服務地址。我們借助這個地址來完成一個簡單的測試。我們找一臺公網(wǎng)上的云主機,其 ip 地址為 180.76.152.113,在上面搭建 Nginx 服務,添加監(jiān)聽9000端口的服務配置如下:

...
http {
    ...
    
    server {
        listen 9000;
        default_type text/plain;
        access_log logs/ws.log;
        location / {
           proxy_http_version 1.1;
           proxy_set_header Upgrade $http_upgrade;
           proxy_set_header Connection "upgrade";
           proxy_pass http://121.40.165.18:8800;
        }
    }
    
    ...
}
...

然后我們將 websocket 在線測試網(wǎng)站中的測試地址改成 ws://180.76.152.113:9000,斷開后再次連接,發(fā)現(xiàn)也能成功,同時能實現(xiàn)原服務的功能。這說明我們的 Nginx 服務成功完成了 Websocket 代理功能。

圖片描述

3.2 uwsgi協(xié)議的反向代理

本次實驗按照如下步驟進行:

  • 首先我們安裝 WSGI server,直接使用 pip 安裝即可:
pip install uwsgi -i https://pypi.tuna.tsinghua.edu.cn/simple
  • 編寫test.py文件:
def application(env, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    return [b'hello world\n',]
  • 啟動 WSGI server并監(jiān)聽7000端口。
# 指定socket連接,監(jiān)聽端口,應用代碼文件以及進程數(shù)
$ uwsgi --socket :7000 --wsgi-file test.py --master --processes 4
  • 在nginx.conf中添加如下 server 指令塊:
server {
    listen 7001;
    default_type text/plain;
    access_log logs/uwsgi.log;
    location / {
        include uwsgi_params;
        uwsgi_pass 127.0.0.1:7000;
    }
}

  • 最后在本地可以請求 Nginx 服務地址的7001端口,可以看到返回 “hello world” 字符串,說明 Nginx 轉(zhuǎn)發(fā) uwsgi 協(xié)議成功。
[shen@shen ~]$ curl http://180.76.152.113:7001
hello world