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

前言

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

你可能感兴趣的:(nginx,python)