- docker架构
nginx+uwsgi+supervisor+ubuntu部署Flask项目:
https://mp.weixin.qq.com/s/xrFNAvRCDIiLdXg-p_DZkw
centos7-下通过nginx-uwsgi部署django项目:
http://projectsedu.com/2017/08/15/centos7-%E4%B8%8B%E9%80%9A%E8%BF%87nginx-uwsgi%E9%83%A8%E7%BD%B2django%E5%BA%94%E7%94%A8/
- 在开发机上的准备工作
-
确认项目没有bug
-
用pip freeze > requirements.txt将当前环境包导出到requirements.txt文件中,方便在部署的时候安装;
后期拿到requirements.txt文件在待部署的环境下执行pip install requirements.txt就能将前期环境的包安装完成。(即完成环境搭建) -
使用Git将项目上传到服务器上:
git init git remote add origin https://gitee.com/fone933/deploy_test.git git add . git commit -m 'first commit' git pull origin master --allow-unrelated-histories git push origin master
pip install xxx出现SSLError
:
使用豆瓣源安装:pip install -i https://pypi.doubanio.com/simple/ virtualenv
yum命令执行30行报错SyntaxError
:
原因: yum包管理是使用python2.x写的,将python2.x升级到python3.x以后,由于python版本语法兼容性导致问题出现
解决办法:
修改yum配置文件,将python版本指向以前的旧版本
vim /usr/bin/yum
#!/usr/bin/python2.7
- 在服务器上的操作(Ubuntu上使用apt命令安装,centos使用yum命令):
- 安装好项目用到的python版本
yum install -y python
yum install -y python-pip
pip install --upgrade pip - 安装virtualenv以及virutalenvwrapper并创建虚拟环境:
pip install virtualenv
pip install virtualenvwrapper
yum -y install vim
vim ~/.bashrc
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh - 安装git:
yum -y install git - 允许远程连接安装OpenSSH:
yum -y install openssh-server openssh-client
service ssh restart - 安装MySQL服务器和客户端:
yum install -y mysql-server mysql-client
yum install libmysqld-dev - 进入虚拟环境中,然后进入到项目所在目录,执行命令pip install -r requirements.txt安装相应的包。
- 在mysql中创建相应的数据库;
- 执行python manage.py migrate命令将迁移文件映射到数据库中,创建相应的表。
- 设置ALLOW_HOST为当前机器IP或域名。
- 执行python manage.py runserver 0.0.0.0:8000,然后在本机浏览器中输入http://服务器IP:8000访问下网站所有页面,确保所有页面都没有错误。
- 设置DEBUG=False,避免如果网站产生错误而将错误信息暴露给用户。
- 收集静态文件:python manage.py collectstatic
- centos7防火墙开放端口:
firewall-cmd --zone=public --add-port=8000/tcp --permanent
firewall-cmd --reload
- 安装uwsgi:用于加载非静态文件
- uwsgi是一个应用服务器,非静态文件的网络请求就必须通过他来完成,他也可以充当静态文件服务器,但不是他的强项。uwsgi是使用python编写的,因此通过pip install uwsgi就可以安装。(必须安装在系统级别环境下)
- 使用命令uwsgi --http :8000 --module [项目名].wsgi --virtualenv=/root/.virtualenvs/django-env-py2。用uwsgi启动项目,如果能够在浏览器中访问到这个页面,说明uwsgi可以加载项目。
编写uwsgi配置文件:
在项目路径下创建 .ini 文件(如 obj_uwsgi.ini),写入一下配置:
```
[uwsgi]
; Django项目路径,必须全部用绝对路径
chdir = /root/commit/deploy_test
; Django的.wsgi文件
module = dobj.wsgi
; python虚拟环境路径
home = /home/.virtualenvs/py2-env
; 指定端口,如果配置了socket就不用指定http
; http = :8000
; 主进程
master = true
; 最大数量的工作进程
processes = 10
; socket文件路径,绝对路径
socket = /root/commit/deploy_test/dobj.sock
; 设置socket的权限
chmod-socket = 666
; 退出时是否清理环境
vacuum = true
; 表示注释
```
注意如果Nginx报权限不足无法连接socket文件,检查一下socket文件及其所在目录的权限。
然后使用命令uwsgi --ini obj_uwsgi.ini看看是否还能启动项目。
- 安装Nginx:用于加载静态文件
- Nginx是web服务器,用来加载静态文件和接收http请求。通过命令yum -y install nginx安装。
- Nginx常用命令:
service nginx start 启动Nginx
service nginx stop 关闭Nginx
service nginx restart 重启Nginx
-
收集静态文件:
静态文件应该让Nginx来加载。首先确保setting.py文件中有配置STATIC_ROOT,这个配置用于指定静态文件要放在哪个目录下。执行python manage.py collectstatic
来收集所有静态文件,将静态文件放在指定的目录(STATIC_ROOT)下。 -
编写Nginx配置文件:
在/etc/nginx/conf.d目录下,新建一个文件(obj.conf),然后写入配置信息:# 配置与uwsgi同步的socket文件 upstream dobj { server unix:///root/commit/deploy_test/dobj.sock; } # 配置服务器 server { # 监听的端口 listen 80; # 允许访问的IP、域名 server_name 192.168.1.6; charset utf-8; # 最大可上传多大的文件 client_max_body_size 75M; # 静态文件访问Url location /static { # 静态文件地址 alias /root/commit/deploy_test/static_dist; } # 配置发送所有静态文件请求到Django服务器 location / { uwsgi_pass dobj; # Nginx下uwsgi_params地址 include /etc/nginx/uwsgi_params; } }
- 注意:uwsgi与Nginx是通过socket进行通信。配置文件中指定的.sock文件会自动创建,两者中的配置文件指定的套接字文件必须一致。
- 写完配置文件后,为了测试配置文件是否设置成功,运行命令:service nginx configtest,如果返回Ok则说明没有问题。
- 每次修改完配置文件,都要运行service nginx restart
- 使用supervisor管理uwsgi进程:
使用supervisor管理uwsgi,可以在uwsgi发生意外挂掉时自动重启。
-
supervisor安装在系统级别环境:
python2版本安装:pip install supervisor
注意:supervisor默认安装(pip install supervisor)无法正常安装在python3环境中,因为默认supervisor只能运行在python2版本下,此时要用以下命令安装python3版本下的supervisor 4.0.0:
pip install -i https://pypi.doubanio.com/simple/ git+https://github.com/Supervisor/supervisor -
在项目的根目录下创建supervisor配置文件.conf(obj_supervisor.conf),编写一下配置信息:
# supervisor的程序名 [program:dobj] # supervisor执行的命令 command=uwsgi --ini obj_uwsgi.ini # 项目的目录 directory = /root/commit/deploy_test # 开始的时候等待多少秒 startsecs=0 # 停止的时候等待多少秒 stopwaitsecs=0 # 自动开启 autostart=true # 程序挂了后自动重启 autorestart=true # 输出的log日志 stdout_logfile=/root/commit/deploy_test/log/supervisord.log # 输出的错误日志 stderr_logfile=/root/commit/deploy_test/log/supervisord.err [supervisord] # log的级别 loglevel=info # 使用supervisorctl的配置 [supervisorctl] # 使用supervisorctl登录的地址和端口号 serverurl = http://127.0.0.1:8000 # 登录supervisorctl的用户名和密码 username = admin password = 123 [inet_http_server] # supervisor的服务器 port = 0.0.0.0:8000 # 用户名和密码 username = admin password = 123 [rpcinterface:supervisor] supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
-
注意:这里指定的log和错误文件中的log目录要自行创建。
然后使用supervisor运行uwsgi:
supervisord -c supervisor.conf
-
使用supervisorctl管理supervisord:supervisor是一个C/S模型,跟redis一样,有一个服务器,也有一个客户端命令用来管理服务的,使用以下命令进入到命令界面:
supervisorctl -c supervisor.conf
-
指定的文件必须和supervisord服务端保持一致。 一些常用的命令有:
supervisorctl -c supervisor.conf
status # 查看状态
start program_name # 启动程序
restart program_name # 重新启动程序
stop program_name # 停止程序
reload # 重新加载配置文件
quit # 退出当前的客户端
页面返回502 Bad Gateway表示Nginx可以正常运行,但是uwsgi挂掉了。