django+nginx+gunicorn项目部署

1.使用UFW打开端口 默认情况下,Linux的防火墙是IPTables。尽管它是一个非常有效和灵活的应用程序,但事实是它不容易管理。因此,社区创造了同样有效但更容易使用的替代品,如UFW。简而言之,U...

1.使用UFW打开端口

默认情况下,Linux的防火墙是IPTables。尽管它是一个非常有效和灵活的应用程序,但事实是它不容易管理。因此,社区创造了同样有效但更容易使用的替代品,如UFW。
简而言之,UFW是Uncomplicated Firewall的缩写,是IPTables的一种前端,但专门用于Ubuntu/Debian。有了它,你可以在系统中快速而方便地设置规则和打开端口。
UFW默认禁用。因此,我们可以通过运行以下命令来检查
sudo ufw status

如果显示status:inactive,则键入如下指令

sudo ufw enable

得到一个与此类似的输出: 

the firewall is active and enabled on system startup

如果再次检查服务的状态,则应该得到以下输出:

Status: active

之后我们可以开始使用ufw,使用如下指令打开指定端口:

sudo ufw allow [port]

例如打开HTTP工作的端口80:

sudo ufw allow 80

会得到如下输出

Rule added
Rule added (v6)

上面情况表示TCP与UDP的80连接已经建立

用同样的方法再打开443(https)和22(ssh)端口:

sudo ufw allow 443
sudo ufw allow 22

2.准备工作

前端文件打包

开发时为了方便(热更新、支持 .vue 文件等功能),用到了专门的前端服务器。部署到正式环境中时就不再需要前端服务器了,而是将代码打包为 js 、 css 等静态资源。因此就需要将前端文件打包。打包方法自行google(没学过我也不会……)

修改后端配置

# drf_vue_blog/settings.py

...

# 修改项。关闭调试模式
# 关闭后 django 不再处理静态资源
DEBUG = False 

# 修改项。允许指定IP访问网络服务,*表示全部
ALLOWED_HOSTS = ['10.68.2.44']

# 新增项。静态文件收集目录
STATIC_ROOT = os.path.join(BASE_DIR, 'collected_static')

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'crowdhmt',
'USER': 'debian-sys-maint', //四卡服务器的默认数据库用户名
'PASSWORD': 'NabEZt5kE7V87n54', //四卡服务器的默认数据库密码
'HOST': '127.0.0.1',        
'PORT': '3306',
} }
部署到正式环境时,后端服务器就不能用 Django 自带的开发服务器了(性能低下),而是改用 Nginx 和 Gunicorn 配合提供网络服务。
  • 1.客户端发来 http 请求,Nginx 作为直接对外的服务器接口,对 http 请求进行分析;
  • 2.如果是静态资源请求,则由Nginx自己处理(效率极高);
  • 3.如果是动态资源请求,则把它转发给 Gunicorn 进行预处理后,转发给 Django,最终完成资源的返回

创建虚拟环境(本文使用已有环境mytorch),安装nginx

apt-get install nginx

进入项目目录,安装依赖、收集静态资源并迁移数据库

(mytorch) ../drf_vue_blog$ pip3 install ...
(mytorch) ../drf_vue_blog$ python3 manage.py collectstatic
(mytorch) ../drf_vue_blog$ python3 manage.py migrate
如果没有将migrations文件夹复制过来的话还须先进行 python3 manage.py makemigrations,再migrate

最后启动 nginx:

(mytorch) ~$ service nginx start

在浏览器中访问服务器的公网IP,看看效果

attachments-2022-12-FLO4hs2A638cd0caad516.png出现此页面说明安装成功!

3.配置nginx

需要重新写 Nginx 的配置文件。/etc/nginx/sites-available目录是定义 Nginx 可用配置的地方。输入指令创建配置文件crowdhmt.com并打开vim
sudo vim /etc/nginx/sites-available/crowdhmt.com

写入如下:

server {
charset utf-8;
listen 80;
server_name 10.68.2.44; # 改成你的 IP # 定义 server 的根路径
# 修改为你的项目的路径
root /data/user8302433/CrowdHMT/drf_vue_blog; # 以下项都是在给静态资源配置转发路径
# 注意路径名称一定要正确
# 特别是中横线 - 和下划线 _ 别弄混了
location /static {
alias /data/user8302433/CrowdHMT/drf_vue_blog/collected_static;
} location /media {
alias /data/user8302433/CrowdHMT/drf_vue_blog/media;
} # 将接口及后台请求转发给 Gunicorn
location ~ (^/api|^/admin) {
proxy_set_header Host $host;
proxy_pass http://unix:/tmp/10.68.2.44.socket; # 改成你的 IP
} # 其他所有请求均直接请求 Vue 打包的 html 文件
location / {
try_files /collected_static/index.html =404;
}
}

此配置会监听 80 端口(通常 http 请求的端口),监听的 IP 地址写你自己的服务器公网 IP。

配置中有3个核心规则:

  • 1.如果请求静态资源,则转发到对应目录中寻找静态资源
  • 2.如果请求接口数据或后台页面,则转发给 Gunicorn
  • 3.其他请求则直接请求 Vue 打包的前端文件
  • 正常情况可以额外配置 location /js 和 location /css ,但是我试过后发现这样反而收集不到静态资源,不知为何

  • 写好后就退出vim编辑器,回到命令行。因为我们写的只是 Nginx 的可用配置,所以还需要把这个配置文件链接到在用配置上去:

    (mytorch) ~$ ln -s /etc/nginx/sites-available/myblog /etc/nginx/sites-enabled
    

    至此 Nginx 就配置好了,接下来搞定 Gunicorn

    有的人无论怎么配置都只能看到 Nginx 欢迎页面,有可能是 sites-enabled 目录中的 default 文件覆盖了你写的配置。将 default 文件删掉就可以正常代理自己的配置文件了

    直接删去default后会遇到问题(很多教程也不说,坑),需要进一步修改,进入/etc/nginx,打开nginx.conf,在60行左右修改代码如下(把原来include .../default给删了):

    ##
    # Virtual Host Configs
    ##

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/crowdhmt.com;

    如果更改了 Nginx 的配置文件,需要重启 Nginx 服务:

    service nginx restart

    4.Gunicorn及测试

    下面的三条命令分别是安装 Gunicorn 、 重启 Nginx 和 启动 Gunicorn

    (mytorch) ~$ pip3 install gunicorn
    (mytorch) ~$ service nginx restart
    # 将 IP 改为你的公网 IP
    # .wsgi 前面为 Django 配置文件所在的目录名
    (mytorch) user8302433@LW-Super-Server:~/CrowdHMT/drf_vue_blog$ gunicorn --bind unix:/tmp/10.68.2.44.socket drf_vue_blog.wsgi:application
    # Gunicorn 成功启动后命令行提示如下 [2022-12-05 00:24:55 +0800] [524047] [INFO] Starting gunicorn 20.1.0 [2022-12-05 00:24:55 +0800] [524047] [INFO] Listening at: unix:/tmp/10.68.2.44.socket (524047) [2022-12-05 00:24:55 +0800] [524047] [INFO] Using worker: sync [2022-12-05 00:24:55 +0800] [524050] [INFO] Booting worker with pid: 524050
  • Gunicorn 就启动成功了。

    接下来用浏览器访问试试:

    attachments-2022-12-TgpPGM9e638ccb245c72b.png没有问题!

    5.进程托管

    假如你关闭终端、关闭 SSH 连接,Web 服务进程就立刻退出了,那不是白忙活了吗?
    不慌,nohup指令一行解决:
    nohup /data/user8302433/anaconda3/envs/mytorch/bin/gunicorn --chdir /data/user8302433/CrowdHMT/drf_vue_blog --bind unix:/tmp/10.68.2.44.socket drf_vue_blog.wsgi:application &
  • /data/user8302433/anaconda3/envs/mytorch/bin/gunicorn 表示虚拟环境中的gunicorn文件路径 --chdir表示项目文件所在路径(很多教程都没有这个,坑)

    而且我尝试使用systemd来管理进程,但是不成功不知道为什么

    注意末尾的&

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
刘士琦
刘士琦

西北工业大学

3 篇文章

作家榜 »

  1. 解弘艺 17 文章
  2. 高曾谊 16 文章
  3. 胡中天 14 文章
  4. 旺仔牛奶opo 14 文章
  5. LH 14 文章
  6. 罗柏荣 13 文章
  7. Panda-admin 13 文章
  8. 林晨 12 文章