简述
Nginx在服务器部署中的作用
请求通过Nginx实现反向代理,将请求提交给代理服务器。本文中只用了一台服务器,所以是代理到本机。
gunicorn的作用
作为服务器代码的容器。接收Nginx的请求后执行代码,并通过nginx将结果最终返回给用户。
flask的作用
flask是python上用于web应用的轻量级的框架。
部署过程
1 在阿里云上租用一台云服务器,本文中使用的是ubuntu系统,以下内容都是在云服务器中进行。
2 使用pip3安装gunicorn
3 运行gunicorn试验一下:
# gunicorn -b 0.0.0.0:5000 myapp:app
注意-b表示绑定,0.0.0.0:5000表示允许所有ip访问,5000表示监听的端口,myapp应该改成相应的你的入口文件名(入口文件即你要运行的web应用代码,记得要带上相应路径,但不要带.py),app是入口文件中你要运行的实例。例如我写的一个最简单的用于测试的入口文件:
1 from flask import Flask 2 3 app = Flask(__name__) 4 5 @app.route('/') 6 def hello_world(): 7 return 'Hello world!' 8 9 if __name__ == '__main__': 10 app.run()
在入口文件app.run()前加入这两行代码:
from werkzeug.contrib.fixers import ProxyFix app.wsgi_app = ProxyFix(app.wsgi_app)
此时在浏览器中输入127.0.0.1:5000应该会返回hello,world了。
注意:如果租用的服务器是纯命令行,可以下载w3m之类的软件实现浏览器访问网页的功能;
如果是需要外网访问,则需要在 阿里云——我的实例——安全组 中添加安全组规则,开放5000端口:
这样就能得到如上上图所示内容。
4 pip3安装nginx
5 修改Nginx配置文件
安装好的文件位置:
/usr/sbin/nginx:主程序
/etc/nginx:存放配置文件
/usr/share/nginx:存放静态文件
/var/log/nginx:存放日志
其实从上面的根目录文件夹可以知道,Linux系统的配置文件一般放在/etc,日志一般放在/var/log,运行的程序一般放在/usr/sbin或者/usr/bin。
进入/etc/nginx后发现下面有如下文件(夹):
有时下载的nginx的配置文件中还会有nginx.conf.defalut,这是nginx的配置文件备份,我们真正需要修改的是nginx.conf。
但实际上一般不直接修改配置文件,建议通过在nginx.conf中引入配置文件的方法来修改配置:
使用vim nginx.conf打开后加入如下命令:
include /etc/nginx/conf.d/*.conf;
表示执行nginx配置文件时,会搜寻conf.d文件下所有后缀为.conf的文件并执行。
我们在该conf.d目录下用vim yyserver.conf新建一个文件,内容为:
server { listen 80; #监听的是80端口,外网访问时输入ip+端口请求即可被nginx收到 server_name localhost; #服务器名为主机名,也可以改为域名 location / { proxy_pass http://127.0.0.1:5000; #Nginx将发送给server_name的请求反向代理到本机5000端口,注意该端口要与gunicorn运行时监听端口一致 proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
修改配置后测试配置文件是否语法正确(在任何目录下测试都行):
重启nginx使配置生效:
# nginx -s reload
这时通过80端口可返回我们想要的hello world:
默认开放的端口就是80。此时的过程是:请求发送到服务器80端口,80端口被监听,根据nginx配置文件反向代理到5000端口,gunicorn收到后,根据路径找到入口文件执行代码。
如果改为ip+5000端口,同样可以得到hello world,此时直接通过gunicorn访问端口并运行代码。
坑1: 用pip下载包记得用pip3 install XXX使得包安装在Python3中
坑2:使用以下方式打开在阿里云租用的服务器(linux)终端:
#进入本机管理员权限
1 $ sudo -s
1 bash-3.2# ssh 服务器ip地址 -p
或者直接用以下命令连接(remote_host在阿里云上都是root):
ssh remote_host@ip