django+uwsgi+nginx 部署笔记

近期通过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 ***

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值