在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)
构想
我按照以下的构想进行了实施。
目录结构构想
唯一重要的是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
操作步驟
-
- 创建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更加简单?
同时,如有错误,请与我联系。
感谢您的阅读至最后。
文献引用