正好一个项目是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的端口了。
在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的。