系统:Ubuntu 18.04 LTS
Python:3.6.8
$ pip3 install gunicorn supervisor
$ sudo apt install nginx
Ubuntu下的nginx配置文件放在这个位置:/etc/nginx/sites-enabled/default
$ sudo vim /etc/nginx/sites-enabled/default
# 修改为下面内容(其他配置内容统统删掉)
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://127.0.0.1:5000;
proxy_redirect off;
proxy_set_header Host $host:80;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
$ sudo systemctl restart nginx # 重启nginx服务
$ echo_supervisord_conf > ~/supervisord.conf # 生成supervisord的配置文件
$ vim ~/supervisord.conf
在配置文件最底部追加下面内容:
[program:wenming]
directory = /home/lpwm/web/wenming_vue
command = gunicorn -w 4 -b 0.0.0.0:5000 app:app
program
后面是应用的名称,自己定义
directory
是flask应用的根目录,我这里flask项目的主入口文件为app.py,所以下面的命令最后的参数用到了app:app
冒号前的app即app.py,冒号后的app代表实例化的flask对象名称
-w 4
表示使用4个线程
0.0.0.0:5000
所有本地的网络地址均使用5000端口提供服务
这里需要注意,使用非系统root账户由于权限原因,不能绑定80之类的小端口号,就用默认的5000就行,80端口后面由nginx提供
执行下面命令测试一下:
$ supervisord -c ~/supervisord.conf
运行成功后使用浏览器直接访问服务器地址或者加上5000端口号均可以打开flask开发的web程序
Ubuntu中修改/etc/rc.d/rc.local
实现开机启动
$ sudo vim /etc/rc.d/rc.local
# 这个文件是不存在的,插入下面内容后保存退出:
supervisord -c ~/supervisord.conf
$ sudo chmod +x /etc/rc.local
服务跑起来内网访问是没问题了,把服务器在防火墙设备上做了NAT转换映射给公网IP+端口后发现从外网访问只能打开首页,登录无法正常跳转到下个页面。
nginx跑的内网服务地址:10.x.x.x:80
防火墙NAT映射后的公网地址:218.x.x.x:60001
用Firefox查了下调试器中的网络,发现首页的登录界面点击登录按钮后跳转的地址没有了60001端口号,当然也就走不动了。
原来是之前nginx配置的时候这一行出的问题:
proxy_set_header Host $host:80;
应该修改为NAT后的端口:
proxy_set_header Host $host:60001;
重启一下nginx,再从公网访问,OJBK~
使用gunicorn
发现存在个问题,应该是项目中没有考虑到多线程之间的通信共用变量的情况,在gunicorn
中如果设置-w 4
使用4个worker启动后,貌似每个worker之间的session
是独立的,所以出现了直接python app.py
跑一点问题都没有,但是用gunicorn -w 4 -b 0.0.0.0:5000 app:app
这种方式跑就老出问题,试了下如果改成-w 1
也没事儿.不过这样的话就失去用gunicorn
的意义了嘛~
记录一下用uwsgi
实现的步骤,nginx
配置部分和上面一样,不用改
# 装轮子
$ pip3 install uwsgi
# 写配置
$ vim uwsgi.ini
配置部分内容自己看着改
[uwsgi]
http = 127.0.0.1:5000
chdir = /home/lyzy/server
module = app:app
processes = 4
master = true
threads = 2
daemonize = /home/lyzy/server/uwsgi.log
pidfile = /home/lyzy/server/uwsgi.pid
跑起来
$ uwsgi --ini uwsgi.ini
项目多了之后还是用
virtualenv
创建独立的python运行环境比较合适,记录一下在gunicorn
和virtualenv
的配合使用步骤
$ pip3 install virtualenv
$ virtualenv venv # 注意在项目根目录下执行
venv
环境下安装gunicorn
$ source venv/bin/activate
(venv) $ pip install gunicorn
(venv) $ pip install -r requirements.txt # 安装项目中的依赖
(venv) $ deactivate
这样就有了venv/bin/gunicorn
可执行程序,可以在supervisord
的配置中创建新的[program]
的时候把command
后面写成项目对应的绝对路径下的venv/bin/gunicorn