1. 程式人生 > >自學nginx(三): nginx + gunicorn的反向代理

自學nginx(三): nginx + gunicorn的反向代理

前言

正好一個專案是python的flask框架開發的,部署的時候就考慮用gunicorn作為應用伺服器,然後再用nginx的反向代理套在應用伺服器的外層。

架構圖

nginx+gunicorn

每一臺server內部,都安裝nginx,以及部署gunicorn的python flask應用程式。nginx和gunicorn之間用unix local socket機制進行連線。

所以gunicorn啟動flask程式的時候,請配置成
bind = “unix:/xxx/xxx.sock”來啟動,這樣就會在/xxx目錄下生成xxx.sock檔案,而不是啟動類似8000的埠了。

nginx反向代理配置

在http模組下(也就是和server模組平行的地方), 先定義一個upstream變數。

upstream myapp_server {
        # for UNIX domain socket setups
        server unix:/xxx/xxx.sock fail_timeout=0;
        # for a TCP configuration
        # server 127.0.0.1:8000 fail_timeout=0;
    }

如果應用伺服器是8000埠的tcp的話,不是unix的socket的話,那麼可以用下面註釋的程式碼。

下面需要配置server,注意我只貼了location的部分,其他server的部分(如access_log, keepalive_timeout之類的)請根據自身的需求合理設定。

# favicon放在其他目錄
location = /favicon.ico {
          root /usr/share/nginx/html;
}
# 靜態檔案直接走靜態目錄
location /static/ {
    alias /usr/share/nginx/html/static/;
}

# 其他的路徑走這個配置
# try_files可以一定程度代替rewrite。
location / {
    try_files $uri @proxy_to_app;
}

# 定義一個變數名字是proxy_to_app的location,並不是路由規則。這個location會作為一個變數代到上面的try_files的地方。
location @proxy_to_app { # 設定一些轉發到應用伺服器的header,使得gunicorn可以獲得一些客戶端來的資訊。 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 如果是https的話,下面這行需要enable # proxy_set_header X-Forwarded-Proto https; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Host $remote_addr; proxy_redirect off; proxy_pass http://myapp_server; }

結語

nginx一側的設定還是比較簡單的。gunicorn的部分這篇就不提了。有機會另外寫一篇gunicorn的。