登录        注册
本站基于Django开发,源码 Github 欢迎 Fork、Star。由于站点升级导致评论区留言信息丢失,欢迎前来发表新的评论

Django个人博客开发二十| Nginx+uwsgi 部署 Django 项目

Django stormsha 2756浏览 135喜欢 0评论
本渣渣不专注技术,只专注使用技术,不是一个资深的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;       # 发送请求超时时间
}

参考文章:Django 部署(Nginx)django+uwsgi+nginx部署

转载请注明: StormSha » Django个人博客开发二十| Nginx+uwsgi 部署 Django 项目

发表我的评论

表情
(0)个小伙伴在吐槽|0条评论
暂时没有评论,欢迎来尬聊!