服务器环境:
ubuntu 16.04
python 2.7
本文公网地址用 123.123.123.123 代替
1.安装phpstudy
参考phpstudy官网给出的安装方法
我选择的是php5.5+nginx+mysql(其实没必要安装php,但是用这种一键安装包基本都是默认要求装php的)
安装完在地址栏输入:123.123.123.123
使用phpstudy是因为有带mysql,phpadmin,pure-ftpd,一键安装起来比较方便,而且在windows的机器上也是使用这个,比较熟悉一点
安装成功
2.安装pip和virtualenv
参考之前的另外一篇文章
3.安装gunicorn和flask
- 安装gunicorn
apt-get install gunicorn
- 创建虚拟环境
virtualenv venv # 创建名为venv的虚拟环境
cd venv # 进入这个文件夹
source bin/activate # 激活虚拟环境
注意到命令提示符变了,有个(venv)前缀,表示当前环境是一个名为venv的Python环境。
virtualenv可以创建一个独立的Python运行环境,已经安装到系统Python环境中的所有第三方包都不会复制过来,这样,我们就得到了一个不带任何第三方包的“干净”的Python运行环境
- 安装flask
pip install flask
小计:我们向服务器发出一个请求,nginx把请求转发给gunicorn,gunicorn找到Python对应的函数。所以我们现在就要把这几个串起来
4.
- 一个简单的 web 服务
vim main.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'hello world'
if __name__ == '__main__':
app.run()
- 创建Nginx的I配置文件
vim /phpstudy/server/nginx/conf/flask.conf
写入配置
server {
listen 8080; # 我外网使用8080端口,这个可以自己制定
server_name 123.123.123.123; # 服务器ip地址,要是有绑定了域名的话,也可以使用域名
location / {
proxy_pass http://127.0.0.1:9090; # 转到内网9090端口
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
- 将flask.conf配置文件导入Nginx主配置文件中(也可以直接将文件放着vhosts文件夹里面,默认包含了vhosts里的conf文件)
vim /phpstudy/server/nginx/conf/nginx.conf
phpstudy restart # 重启一下
nginx把发来的请求转发给内网9090端口,现在让gunicorn监听9090端口
gunicorn -b 127.0.0.1:9090 main:app
访问 123.123.123.123:8080
成功了
当然,也不能gunicorn一直在前台这样运行,所以我们引入 supervisor
- 安装设置supervisor
deactivate # 退出虚拟环境
apt-get install supervisor # 安装supervisor
有文章说通过 apt-get install supervisor这种方式安装后,自动设置为开机启动;通过 pip install supervisor 进行安装需要手动启动,然后设置为开机启动。我没尝试过,为了避免麻烦,直接apt-get了
updatedb # 更新一下数据
locate supervisord.conf
我的supervisord.conf在 /etc/supervisor目录下,大部分教程安装后都是在/ect下,我也不明白为什么,但是这个目录可不能弄错了,最好自己确认一下位置
主配置文件显示,包含了/etc/supervisor/conf.d/目录下所有conf后缀的文件
我们也创建一个flask配置文件
vim /etc/supervisor/conf.d/flask.conf
写入配置
[program:myweb] # 进程名称,可随便设置
directory = /root/venv ; 程序的启动目录
command = gunicorn -b 127.0.0.1:9090 main:app ; 启动命令,可以看出与手动在命令行启动的命令是一样的
autostart = true ; 在 supervisord 启动的时候也自动启动
startsecs = 5 ; 启动 5 秒后没有异常退出,就当作已经正常启动了
autorestart = true ; 程序异常退出后自动重启
startretries = 3 ; 启动失败自动重试次数,默认是 3
user = root ; 用哪个用户启动
redirect_stderr = true ; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes = 20MB ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = 20 ; stdout 日志文件备份数
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile = /root/venv/logs/flask.log
environment=PYTHONPATH=$PYTHONPATH:/root/venv/lib/python2.7/site-packages ; 添加需要的环境变量
mkdir ~/venv/logs # 创建日志文件目录
service supervisor restart # 重启supervisor服务
完成
tail /var/log/supervisor/supervisord.log # 查看supervisord.log看看运行情况
不明白Server ‘unix_http_server’ running without any HTTP authentication checking这句话是什么意思
但是程序还是运行起来了
注:为了区别,main.py文件被我改成hello了