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 条评论

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

西北工业大学

4 篇文章

作家榜 »

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