近期通过uwsgi+nginx部署Django应用走了些弯路,也验证了生成式人工智能(同时使用了文心一言4.0Turbo和GPT4o)对于给出python代码的建议挺灵的,但对于uwsgi和nginx的部署明显知识不足,给的答案不够精准。所以写个笔记备考。
更加详细的部署细节可以参考django+uwsgi+nginx 部署的完整流程_django uwsgi-CSDN博客这篇文章,这里只总结对我个人来说学到的点:
1. django通过runserver的方式只能够接受一个用户的访问,只能够供测试用,无法在生产环境下使用;
2. 且在服务器上通过runserver尝试远程访问时settings.py文件里的ALLOWED_HOSTS要包含服务器的私网IP地址,不能是公网IP地址,或者直接用“*”代表允许所有IP地址
3. 无论settings.py文件里的Debug开关是否设置为False,在uwsgi上部署好后都会遇到css、js等文件下载不了的问题(似乎最开始的时候没遇到这个问题,后续Debug来回改都是这个问题),需要在settings.py文件里设置STATIC_ROOT参数而不是之前的STATIC_URL参数,然后运行以下命令将资源文件复制到python manage.py collectstatic然后再通过uwsgi启动网站。
python manage.py collectstatic
4. 上述命令会在STATIC_ROOT参数指定的文件夹里还会多创建一个admin文件夹,对应admin站点需要的资源文件
5. 通过运行以下命令来启动网站,验证之前的配置是否OK,将端口还有路径、应用名替换成你的应用的实际名称,留意myapp.wsgi并不是真有这一个wsgi文件而是指的/root/myapp项目根文件夹下面的myapp文件夹下的wsgi.py文件
uwsgi --http :8080 --chdir /home/myapp -w myapp.wsgi
6. 如果希望在后台启动网站可以在项目根目录下面运行sudo uwsgi uwsgi.ini文件,加sudo是因为哪怕是以root的身份登录来运行uwsgi命令也会遇到权限问题,linux系统懂的不多,加上保险。ini文件的名称可以随便其,文件的内容参考如下,里面还可以加一些参数如输出的日志文件的地址,pid文件的地址等。留意:8080前面可以给出公网的IP地址告诉uwsgi监听哪个IP地址,不给具体的IP地址代表监听所有到本机8080端口的访问。
[uwsgi]
web = :8080
# 工作路径(你的项目根目录路径)。
chdir = /home/myapp/
# 这个用来解决资源文件找不到的问题
static-map = /static=/home/myapp/resources
# wsgi文件路径,项目调用的主程序文件(不在项目根目录需要带上路径)。
module = myapp.wsgi:application
# 设置进程数和线程数。
processes = 4
threads = 2
master = true
enable-threads = true
vacuum=true
# 多进程运行时记录所有的pid可以通过uwsgi --stop uwsgi.pid来快捷停止相应的进程
pidfile = /home/myapp/uwsgi.pid
# 日志文件
daemonize = /home/myapp/uwsgi.log
7. 接下来配置nginx服务,nginx将外部的访问通过socket端口转发到uwsgi,所以上面ini配置文件的第一个参数web要改为socket。nginx的配置文件可以直接在/etc/nginx/nginx.conf文件里面配置也可以在其他地方配置,这里在/etc/nginx/conf.d/myapp.conf文件里配置,而nginx.conf文件有包含对conf.d文件夹的引用。以下是我的真实配置,其中server_name用过_来表示所有IP遇到nginx报错冲突大概意思是配置文件只能有一处有这种通配所有IP地址的设置,翻了下nginx.conf应该是没有,但anyway用了公网IP地址在这里是正确的配置,表明nginx会监听这个IP地址的80端口,下面uwsgi_pass配置的是nginx会转发的端口,用公网IP地址行不行没试过。前面的那篇博文里还听到静态文件还有media文件可以在这里配置,没配也没问题。
server {
listen 80;
server_name 139.196.180.168;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8080;
}
}
基本就上面这些,还有些有用的linux系统命令如下:
# 查看哪些进程在8080端口运行,然后用Kill -9来强制停止
sudo lsof -i :8080
# 检查nginx的配置文件有没有问题
sudo nginx -t
# 查看nignx的日志
sudo tail -f /var/log/nginx/access.log
sudo tail -f /var/log/nginx/error.log
# 修改配置文件后重新load nginx
sudo systemctl reload nginx 、
# 查看文件夹的权限
ls -ld /home/myapp/resources
# 在ubuntu里使用apt来安装,apt-get也行,但apt应该更高级,yum是另外一个体系的linux
sudo apt install ***