Linux发布项目
项目发布
发布项目将用到的软件
nginx
uwsgi
CentOS7
项目文件
virtualenv
supervisor
wsgi, uwsgi :
python web服务器开发使用wsgi协议(Web Server Gateway Interface)
python web项目默认会生成一个wsgi.py文件, 确定好应用模块.
生产环境下使用的是uwsgi, 实现了wsgi所有接口, c语言编写, 效率很高的web服务器.
uwsgi是一个全功能的HTTP服务器, 实现了wsgi协议, uwsgi协议, http协议等. 它要做的就是把http协议转化成语言支持的网络协议, 比如把http协议转化为wsgi协议, 让python可以直接使用.
Nginx :
使用nginx是为了它的反向代理功能, 项目会通过Django+uwsgi+nginx进行服务器线上部署.
CentOS :
通过xftp, scp, lrzsz等上传文件将项目压缩文件上传至CentOS服务器.
Linux使用技巧 :
通过xshell或者iTerm等软件, 多终端操作你的linux, 这样对uwsgi, nginx, 项目代码调试的时候, 避免来回切换目录, 提高工作效率
注意每次修改了linux软件的配置文件之后, 都要讲服务重新启动一下才能生效.
virtualenv :
使用虚拟环境, 隔离python解释器的环境, 防止软件依赖和冲突的问题
supervisor :
supervisor是用python开发的一个client/server服务, 是Linux/Unix系统下的一个进程管理工具, 不支持windows系统. 他可以很方便的监听, 启动, 停止, 重启一个或多个进程. 用supervisor管理的进程, 当一个进程意外被杀死, supervisor监听到进程死后, 会自动将它重新拉起, 很方便的做到进程自动恢复的功能, 不需要自己写shell脚本来控制.
项目部署
准备工作 :
项目发布需要在Linux上启动数据库 并且Linux环境内安装pymysql, 并且更改setting.py文件内的数据库连接信息 Linux环境内也需要安装django-multiselectfield settings.py内更改允许主机 :ALLOWED_HOSTS = ['*']
1. 激活虚拟环境 :
#创建基于python3的虚拟解释器环境venv virtualenv --no-site-packages --python=python3 venv #激活python3虚拟环境 [root@localhost /data 11:11:30]#source venv/bin/activate (venv) [root@localhost /data 11:11:35]# ------------------------------------------------------------------------ # 安装了virtualenvwrapper的话直接创建 mkvirtualenv venv
2. 安装uwsgi :
# 在虚拟环境内安装 (venv) [root@localhost /data 11:11:35]#pip3 install uwsgi
# 在预部署项目的目录内创建uwsgi.ini文件并做配置
[uwsgi] #项目的绝对路径,定位到项目的第一层 chdir =/opt/xx(项目目录) #指明项目的wsgi文件路径 module =xx(项目目录).wsgi #指明虚拟解释器的第一层路径 home = /root/all_envs(总虚拟环境目录)/xxx(部署项目的虚拟环境名) #指明通过uwsgi,启动的进程数 processes = 5 #如果已经配置了nginx(启动了服务, 配置了uwsgi_pass),请用这个socket连接 socket = 0.0.0.0:9000 #如果没有使用nginx, 想通过uwsgi直接启动web服务,指明http协议 #http = 0.0.0.0:9000 # 在退出uwsgi环境后, 清空环境变量 vacuum = true
# uwsgi常见问题 uwsgi启动项目的时候, 很有可能会抱一个错误 : no application(找不到应用) 意思就是 : uwsgi找不到项目的wsgi.py 其实uwsgi是通过application对象加载项目的 application = get_wsgi_application()
3. 安装nginx :
配置nginx.conf, 通过nginx反向代理将请求丢给django处理
nginx接收到了基于wsgi协议的动态请求, 然后通过uwsgi_pass转发给uwsgi服务器.
#user nobody; worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /data/access.log main; sendfile on; keepalive_timeout 65; #定义负载均衡池(即存放服务器的池子) upstream xx{ server 127.0.0.1:9000; } server { listen 80; server_name www.xd.com; location / { uwsgi_pass xx; include /opt/nginx1-12/conf/uwsgi_params; } location /static {
通过nginx处理静态文件 alias /opt/static/; } error_page 400 402 403 404 /40x.html; location = /40x.html { root /data/xd/; } } }
配置静态资源文件目录是因为让静态资源通过nginx可以直接返回, 不需要通过uwsgi, 也就是让uwsgi只处理后端逻辑, 不处理静态资源, 优化性能.
4. 配置静态资源
# 配置django的settings.py, 收集所有项目所需的静态文件 1. 通过命令, 收集整个项目所需要的静态文件, 放入到一个固定文件夹内 STATIC_ROOT='/opt/static/' 2. 执行命令 python3 manage.py collectstatic 3. 此时项目内的所有静态文件, 都跑到/opt/static/目录下了
5. 配置完成之后启动nginx和uwsgi
# 启动nginx sbin/nginx -t # 语法检查 sbin/nginx # 启动nginx -------------------------------------------------------------- # 启动uwsgi启动项目 uwsgi --ini uwsgi.ini
--------------------------------------------------------------
如果想要停止uwsgi可以使用ps -ef |grep uwsgi
killall -9 uwsgi
以上步骤完成后,访问服务器主机地址和端口,如果nginx.conf中配置的为80端口,则地址栏不需要输入端口,因为浏览器请求端口也是默认为80端口,非80端口的需要自己在ip后面添加