自學nginx(三): nginx + gunicorn的反向代理
阿新 • • 發佈:2019-01-07
前言
正好一個專案是python的flask框架開發的,部署的時候就考慮用gunicorn作為應用伺服器,然後再用nginx的反向代理套在應用伺服器的外層。
架構圖
每一臺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的。