本渣渣不专注技术,只专注使用技术,不是一个资深的coder,是一个不折不扣的copier |
使用目前主流 nginx + uwsgi socket 的方式来部署 Django项目
一、运行开发服务器测试
# 进入项目 blog 目录 cd blog python manage.py runserver
运行开发服务器测试,确保开发服务器下能正常打开网站
二、安装 nginx 和 需要的包
1、安装 nginx
sudo apt-get install python-dev nginx cd /etc/nginx/ # 进入nginx安装目录,一般默认都在这里
三、uwsgi 部署项目
1、安装 uwsgi
sudo pip install uwsgi --upgrade
2、uwsgi 运行项目
uwsgi --http :8001 --chdir /home/ubuntu/blog --home=/path/to/env --module blog.wsgi
在本机输入:host:8001,此时便可以远程访问服务器运行的项目,host即为服务器IP
--home 指定 virtualenv 路径,如果不用虚拟环境可以去掉。blog.wsgi 指向 blog/wsgi.py 文件
上面运行服务命令太复杂,使用 ini 配置文件来简化启动命令,比如项目位置 /home/ubuntu/blog,
cd /home/ubuntu 创建 blog_uwsgi.ini 文件
/home/ubuntu/blog_uwsgi.ini
[uwsgi] project = blog # 指定项目文件 base = /home/ubuntu/blog # 指定项目文件路径 chdir = %(base) module = %(project).wsgi:application home = /root/.virtualenvs/blog master = true processes = 5 socket = /home/ubuntu/sock/new.sock chmod-socket = 666 vacuum = true
uwsgi 常用配置选项:
socket :地址和端口号,例如:socket = 127.0.0.1:50000
processes :开启的进程数量
workers :开启的进程数量
chdir :指定运行目录
wsgi-file :载入 wsgi-file
stats :在指定的地址上,开启状态服务
threads :运行线程
master :允许主进程存在
daemonize :使进程在后台运行,并将日志打到指定的日志文件或者udp服务器,实际上最常用的,还是把运行记录输出到一个本地文件上
pidfile :指定pid文件的位置,记录主进程的pid号
vacuum :当服务器退出的时候自动清理环境,删除unix socket文件和pid文件
disable-logging :不记录请求信息的日志。只记录错误以及uWSGI内部消息到日志中
/home/ubuntu/sock/new.sock ,这是一个和 nginx 通信的 socket 文件
不建议在项目目录下存放 socket 文件,可以专门创建一个目录来存放 sock 文件
新建 /home/ubuntu/sock
$sudo mkdir /home/ubuntu/sock $sudo chmod 777 /home/ubuntu/sock
sudo chmod 777,开放sock文件所有操作权限
四、配置 nginx
新建一个文件 blog
sudo vim /etc/nginx/sites-available/blog # vim 存在blog则打开,不存在则创建并打开
添加如下配置信息
server { listen 443; server_name stormsha.com www.stormsha.com; proxy_connect_timeout 600; # 连接请求超时时间 proxy_read_timeout 600; # 应答请求超时时间 proxy_send_timeout 600; # 发送请求超时时间 # 配置HTTPS证书信息 ssl on; ssl_certificate /home/ubuntu/www/1_www.stormsha.com_bundle.crt; # 证书放置位置 ssl_certificate_key /home/ubuntu/www/2_www.stormsha.com.key; # 证书放置位置 ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; # 证书配置结束 charset utf-8; client_max_body_size 75M; # 项目代理 location /media { alias /home/ubuntu/www/media; # 代理媒体文件 } location /static { alias /home/ubuntu/www/nginx/static; # 代理静态文件 } location / { uwsgi_pass unix:///home/ubuntu/sock/new.sock; # 代理项目,即127.0.0.1:8000运行的项目 include /etc/nginx/uwsgi_params; } } server { listen 80; server_name stormsha.com www.stormsha.com; proxy_connect_timeout 600; # 连接请求超时时间 proxy_read_timeout 600; # 应答请求超时时间 proxy_send_timeout 600; # 发送请求超时时间 rewrite ^(.*)$ https://$host$1 permanent; }
简单知道一下,nginx 监听的逻辑,nginx还有很多优化的设置,我很多我也没搞清楚,就先不说了
443: 监听 https 请求
80: 监听 http 请求
server_name:允许用户请求的域名
比如用户请求:http://stormsha.com 或 http://www.stormsha.com, 80 端口 收到请求
直接使用 rewrite ^(.*)$ https://$host$1 permanent; 重写请求为
https://stormsha.com、https://www.stormsha.com
443端口监听到 https 请求,那么就去请求项目运行地址,127.0.0.1:8000
这样项目就跑起来了
激活网站:
Sudo ln –s /etc/nginx/sites-available/blog /etc/nginx/sites-enabled/blog
测试配置信息语法是否有误
sudo service nginx configtest 或 /path/to/nginx -t
重启 nginx 服务器:
sudo service nginx restart 或sudo service nginx reload 或 /path/to/nginx -s reload
五、安装 supervisor
supervisor, 一个专门用来管理管理 uwsgi 进程的工具
# python 2.x sudo pip install supervisor # python 3.x pip3 install git+https://github.com/Supervisor/supervisor
生成 supervisor 默认配置文件,比如我们放在 /etc/supervisor/supervisord.conf 路径中:
(sudo) echo_supervisord_conf > /etc/supervisor/supervisord.conf
打开 supervisor.conf 在最底部添加(每一行前面不要有空格,防止报错):
[program:blog] command=/usr/local/bin/uwsgi --ini /home/ubuntu/blog_uwsgi.ini directory=/home/ubuntu/blog startsecs=0 stopwaitsecs=0 autostart=true autorestart=true
/usr/local/bin/uwsgi 默认安装的 ngnix一般在 /etc/
重启 blog 程序(项目):
(sudo) supervisorctl -c /etc/supervisor/supervisord.conf restart blog
启动,停止,或重启 supervisor 管理的某个程序 或 所有程序:
(sudo) supervisorctl -c /etc/supervisor/supervisord.conf start|stop|restart program-name|all
六、项目升级
那么有一个问题,如果在不是使用 docker 的情况下,怎么升级项目,每次如果项目有变动都去
1、设置软连接
ln -s [目标目录] [软链接地址]
配置uwsgi配置和nginx配置时将涉及项目路径固定为 /home/ubuntu/www/
/home/ubuntu/blog_uwsgi.ini
[uwsgi] project = blog # 指定项目文件 base = /home/ubuntu/www # 指定项目文件路径 chdir = %(base) module = %(project).wsgi:application home = /root/.virtualenvs/blog # 虚拟环境路径 master = true processes = 5 socket = /home/ubuntu/sock/new.sock chmod-socket = 666 vacuum = true
将项目目录,指向固定路径,比如将 /home/ubuntu/www/ 以现在项目为例,改为软连接启动:应该指向 home/ubuntu/blog 目录,home/ubuntu/blog是项目路径,可以放置在任何地方
ln -s home/ubuntu/blog /home/ubuntu/www/
2、更新网站版本
只需将/home/ubuntu/www/指向新的项目目录即可,比如将/home/ubuntu/www/修改指向home/ubuntu/blog2,然后重启服务器即可
ln -snf home/ubuntu/blog2 /home/ubuntu/www/ supervisorctl -c /etc/supervisor/supervisord.conf restart service nginx restart
七、总结
1、nginx 常用命令
sudo service nginx start # 启动nginx sudo service nginx stop # 关闭nginx sudo /etc/init.d/nginx restart # 重启
2、supervisor 常用命令
(sudo) supervisorctl -c /etc/supervisor/supervisord.conf start program-name|all # 启动项目 (sudo) supervisorctl -c /etc/supervisor/supervisord.conf stop program-name|all # 停止项目 (sudo) supervisorctl -c /etc/supervisor/supervisord.conf restart program-name|all # 重启项目
【注意】——如果网站使用CDN加速,nginx 配置文件里,只需要写下边的内容即可,443 https 就不需要配置了,这都由 CDN 代理服务器干了
server { listen 80; server_name stormsha.com www.stormsha.com; proxy_connect_timeout 600; # 连接请求超时时间 proxy_read_timeout 600; # 应答请求超时时间 proxy_send_timeout 600; # 发送请求超时时间 }