一. 部署python项目的方式
python web项目的部署方式,根据网上资料有9种,请参考资料,本文不做详细描述。仅根据网上找到的资料进行部署测试。
其他参考资料:
区分wsgi、uWSGI、uwsgi、php-fpm、CGI、FastCGI的概念
阿里云部署django网站教程(Ngnix +Uwsgi + virtualenv)
使用 Nginx 和 Gunicorn 部署 Django 博客
请先建立如下常见概念:
web服务器:nginx,apache,uWSGI,tornado,flup
协议:wsgi(用于web服务器和python的web程序间通讯)
uwsgi(专用于uWSGI这种python web服务器)
cgi(一种通用的web标准,规定web服务器传送数据的标准格式,为了实现cgi协议,而启动的进程就是cgi进程了)
fastcgi(对cgi协议的性能优化协议,实现cgi的进程会反复启动进程,php解释器反复初始化,浪费资源,对此fastcgi规定一个master进程负责调度,后续的php-cgi,php-fpm都是这一协议的产物)
php-fpm(可以视为php-cgi的升级优化,之所以还有php-cgi,因为windows不支持php-fpm啊,绝望的windows,一种实现fastcgi协议的进程管理器)
模块:mod_wsgi(可视为apache服务器的扩展模块,支持wsgi协议,小白的说,你当他是apache服务器的翻译器,将Apache送出的数据,按照wsgi协议标准化后发送给python web程序处理)
关于cgi,fastcgi,php-cgi,php-fpm的关系,可参考讨论资料
二. 以下为本人尝试的部署方式:
1. nginx+uWSGI部署Django网站
首先:原理理解
nginx,uWSGI,virtualenv,django四者之间的是怎样进行工作的?
首先,Nginx负责接受外部客户端请求并对其htpp请求进行解包,若请求是静态文件则根据设置好的静态文件路径返回对应内容。若请求是动态内容则将请求交给uWSGI服务器(nginx和uWSGI使用socket通信)。
然后,uWSGI服务器根据wsgi协议解析并回调virtualenv中的django应用。
接着,django则根据请求进行数据库查找和模版渲染等工作(总之就是返回一个响应内容)然后再逆方向返回到Nginx
最后,Nginx将响应交给客户端。
具体部署的操作步骤:
第一步,创建一个简单的Django web程序DeployTest,设置与静态文件static_url,static_root;媒体文件media_url,media_root;一串secure相关的settings文件设置,
第二步,检查web项目deploy,参数是否设置完毕。
manager.py check --deploy
第三步,生成requirements.txt文件,描述项目的依赖包
pip freeze>requirements.txt
第四步,scp命令将本地文件上传给阿里云服务器,本人这里使用了/website/DeployTest作为项目目录
scp -r /Users/yujin/PycharmProjects/DeployTest root@目标IP:/website/DeployTest
第五步,/website/DeployTest,linux生成项目依赖
pyenv local virtualenv 创建虚拟环境
pip install -r requirements.txt 解决环境和项目依赖问题
ls -al /root/.pyenv/versions/VirtualenvForDeployTest/lib/python3.6/site-packages/ 查看下你的虚拟环境安装的第三方包情况,是否满足邀请
第六步,安装nginx服务器
yum install nginx
第七步,安装uWSGI服务器
pip install uWSGI
第八步,增加配置,将uWSGI和django web程序集成
写配置文件,随意命名为uwsgi.ini文件
注意大坑,#号不是注释,直接复制粘贴,导致uwgsi启动失败。另外错误信息中缺乏的文件,可以locate 文件名,或者直接新建的方式解决。
[uwsgi] #配置
socket=127.0.0.1:8080 #uWSGI服务器启动占用的地址和端口
static-map=/static=/website/DeployTest/collected_static #设置django静态文件夹的路径
chdir=/website/DeployTest #设置django的路径
module=DeployTest.wsgi:application
;virtualenv = /home/aihunter #设置虚拟环境路径,不设置的话在会找不到django
master=true #设置是否允许主进程存在
process=5 #设置进程数量
harakiri=30 #客户端请求超过设置
vacuum=true #设置服务器退出时自动清理环境
pidfile=/tmp/project-master.pid
max-requests=5000
daemonize=/var/log/uwsgi/yourproject.log
第九步:启动nginx服务
server {
listen 80; #设置nginx服务器开启的端口号
server_name www.aihunter.cc; #这里填写你自己的域名
charset utf-8;
client_max_body_size 75M;
location /static {
alias home/virtuweb/testproject/testmodel/static; #设置django静态文件路径
}
location / {
uwsgi_pass 127.0.0.1:8080; #设置为uwsgi服务器开启的端口
include /etc/nginx/uwsgi_params; #设置uwsgi_params文件路径
}
}
启动nginx
nginx 或者nginx目录下 ./nginx
nginx -s reload 重启
第十步:启动uwsgi服务:
uwsgi --ini testproject_uwsgi.ini
第十一步:自行访问网址验证了。
2. nginx+Gunicorn部署Django网站
第一步,安装nginx,不再描述
第二步,修改配置文件
server {
listen 80;
server_name #这里写你的域名;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real_IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
第三步,启动nginx
nginx 或者nginx目录下 ./nginx
nginx -s reload 重启
第四步,安装gunicorn,在项目目录下执行,保证所使用的python虚拟环境
pip install Gunicorn
在settings文件中,INSTALLED_APPS选项,增加'gunicorn'
第五步,启动gunicorn
命令行中执行
gunicorn YourProject.wsgi
第六步,检查结果