在Ubuntu22.04上使用Django + nginx + gunicorn + MySQL创建生产环境

你只需要用中文转述这个概要的一个选择。

在创建Django应用程序之后,在将其部署到生产环境(本地)时,我遇到了一些问题,所以我将记录下来以备备忘。
作为我遇到的问题,Django应用程序和Nginx的连接未正常工作,导致本应显示的页面实际上显示了Hello页面(默认页面)。
如果有其他人也遇到了同样的问题或者打算做同样的事情,希望这些记录对他们有所帮助。

我希望我的解释可以让任何人都能理解,但是我认为需要一定的Django知识。

假设

前提是完成 Django 应用程序的开发、安装 MySQL、安装 Nginx。如果无法完成这些步骤,请参考这些文章进行配置。

MySQL的建立

 

安装最新版本的nginx:

 

    • フレームワーク: Django == 4.2.5

 

    • DB: MySQL == 8.0.34

 

    • APサーバ: Gunicorn == 21.2.0

 

    • Webサーバ: Nginx == 1.24.0

 

    Python: python3.10.12

在使用环境中。

我认为最重要的是服务器的操作系统,但我会进行记录。

    • server

OS: Ubuntu22.04 LTS

client

OS: MacOS Ventura 13.4.1(c)

构想

我按照以下的构想进行了实施。

server_image_page-0001.jpg

目录结构构想

唯一重要的是yourproject/yourproject/settings.py。app1等指的是各自的应用程序。

.
├── bin # 仮想環境
└── yourproject # それぞれのプロジェクト
    ├── app1
    ├── app2
    ├── app3
    ├── yourproject
    │   ├── __init__.py
    │   ├── asgi.py
    │   ├── settings.py # 今回はここだけ変更します
    │   ├── urls.py
    │   └── wsgi.py
    └── templates
        ├── app1
        ├── app2
        └── app3

操作步驟

    1. 创建Django应用程序(这里省略)

更新apt和pip
sudo apt update
python3 -m pip install –upgrade pip

安装virtualenv
python3 -m pip install virtualenv

设置和激活虚拟环境
$ sudo apt install python3.10-venv
$ python3 -m venv .
$ source bin/activate

完成后,在终端的用户名之前应该显示为像”(正在工作的目录名)hoge@hoge:~/…$”这样的内容。

安装虚拟环境所需的软件
$ python3 -m pip install django gunicorn psycopg2-binary
$ sudo apt install curl

上述内容是必需的。
还可以随时安装其他所需的软件,因为在运行runserver时会显示所缺少的内容。

编辑Django应用的settings.py

yourproject/yourproject/settings.py
$ cd yourproject/yourproject
$ vi settings.py

#请编辑以下部分
ALLOWED_HOSTS = [‘*’]

#将导入放在文件开头
import os
STATIC_URL = ‘/static/’
STATIC_ROOT = os.path.join(BASE_DIR, ‘static/’)

编辑后,可以使用任何编辑器都可以,包括vscode。

本次不考虑安全性。因此,ALLOWED_HOSTS = [‘*’],但实际上应只允许使用的IP。

迁移数据库并创建管理员用户

yourproject
$ python3 manage.py makemigrations
$ python3 manage.py migrate
$ python3 manage.py createsuperuser
#控制台会显示各种内容,请创建一个不可猜测的用户。

如果已经创建了迁移和管理员用户,可以跳过此步骤。

收集静态文件

yourproject
$ python3 manage.py collectstatic

防火墙设置

yourproject
$ sudo ufw allow 8000

检查Django应用是否启动

yourproject
$ python3 manage.py runserver

检查是否使用Gunicorn启动

yourproject
$ gunicorn –bind 0.0.0.0:8000 yourproject.wsgi

在settings.py所在的目录中移动并执行此命令。
首先在浏览器中打开http://your_ip:8000,如果看到应用程序界面,则表示正常。

创建systemd套接字
$ sudo vi /etc/systemd/system/gunicorn.socket

#写入以下内容
[Unit]
Description=gunicorn socket
[Socket]
ListenStream=/run/gunicorn.sock
[Install]
WantedBy=sockets.target

创建服务文件
$ sudo vi /etc/systemd/system/gunicorn.service

#使用适当的更改写入以下内容(请删除”()”)
[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target
[Service]
User=sammy(Ubuntu用户名)
Group=sammy(使用Ubuntu用户名)
WorkingDirectory=/home/sammy/yourprojectdir(settings.py的上级路径)
ExecStart=/home/sammy/yourprojectdir/bin/gunicorn \(bin/gunicorn的路径)
–access-logfile – \
–workers 3 \
–bind unix:/run/gunicorn.sock \
yourproject.wsgi:application(yourproject是创建的应用程序名称)
[Install]
WantedBy=multi-user.target

其他设置(超时等)请参考官方文档。
https://docs.gunicorn.org/en/stable/settings.html

执行Gunicorn套接字并激活套接字
$ sudo systemctl start gunicorn.socket
$ sudo systemctl enable gunicorn.socket
$ sudo systemctl status gunicorn.socket

如果状态显示为Active为active,则表示正常。其他信息为绿色的⚪︎表示启动完成。

检查是否存在gunicorn.sock文件
$ file /run/gunicorn.sock
#如果显示下面的内容,则表示正常
/run/gunicorn.sock: socket

如果遇到问题,请检查是否已创建套接字,使用以下命令进行调试。
$ sudo journalctl -u gunicorn.socket

通信检查
$ sudo systemctl status gunicorn
$ curl –unix-socket /run/gunicorn.sock localhost

#如果返回html响应码(200),则表示正常。
$ sudo systemctl daemon-reload
$ sudo systemctl restart gunicorn
$ sudo systemctl start nginx

配置nginx的Gunicorn代理
$ sudo vi /etc/nginx/conf.d/yourproject.conf

#根据需要进行适当更改(注意缩进)
server {
listen 80;
server_name server_IP;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/sammy/yourprojectdir;
}
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://unix:/run/gunicorn.sock;
}
}

$ sudo rm /etc/nginx/conf.d/default.conf

请注意缩进。我在这里就因为缩进错误而遇到了问题。

检查nginx是否正确配置
$ sudo nginx -t
#如果显示下面的内容,则表示正常
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

$ sudo systemctl restart nginx

防火墙设置
$ sudo ufw delete allow 8000
$ sudo ufw app list
$ sudo ufw allow 80,443/tcp
$ sudo vi /etc/ufw/applications.d/nginx.ini

#写入以下内容

[Nginx HTTP]
title=Web Server
description=Enable NGINX HTTP traffic
ports=80/tcp

[Nginx HTTPS]
title=Web Server (HTTPS)
description=Enable NGINX HTTPS traffic
ports=443/tcp

[Nginx Full]
title=Web Server (HTTP,HTTPS)
description=Enable NGINX HTTP and HTTPS traffic
ports=80,443/tcp

$ sudo ufw app update nginx
$ sudo ufw app info ‘Nginx HTTP’
$ sudo ufw allow ‘Nginx HTTP’
$ sudo ufw allow ‘Nginx Full’
$ sudo ufw status
$ sudo ufw enable

检查通信(最后一步)
打开浏览器并访问http://your_ip,应该可以看到Django应用程序。(可能会出现css样式错误的情况)

中文翻译:结束

希望有人能够实施相同困扰的解决方案,若有了解的人,请告诉我是否使用Docker更加简单?
同时,如有错误,请与我联系。
感谢您的阅读至最后。

文献引用

 

广告
将在 10 秒后关闭
bannerAds