Nginx+Uwsgi云端部署Django项目实操(静态文件导入失败避坑指南)

前提:假设你已经有了本地可以跑的Django项目了,如何没有可以参考:一步一步教你搭建一个Django项目(不含包安装)_一步一步django-CSDN博客

正文:如何在云端部署一个Django项目

我碰到的最大的坑就是用了宝塔面板的Nginx,导致静态文件不管怎么配都无法导入,卸载宝塔之后,重新安装Nginx,按照网上操作指南,顺利搞定,下面再记录一下具体步骤,供大家参考:

一. 配置settings.py

settgins.py里需要配置的几点:

1. DEBUG = False

2.ALLOWED_HOSTS = ['*']

3.STATIC_ROOT = 'static_root/' (static_root目录是用来收集项目静态文件的,它是相对路径,父路径就是项目目录,后面会讲如何收集,Nginx的静态文件目录也需要指向这个目录,后面会讲)

settgins.py需要配置的就是这么多。

关于STATIC_ROOT, STATIC_URL的更多解释,请参考:Django的STATIC_URL与STATIC_ROOT与STATICFILES_DIRS详解以及本地访问static图片资源_staticfiles_dirs static_root-CSDN博客 

二. 收集项目静态文件

运行python manage.py collectstatic,会自动将项目的所有静态文件收集到刚才定义的STATIC_ROOT目录下。

注意:除了上面settings.py里定义的STATIC_ROOT以外,和静态文件有关的设置在Nginx的配置里也会遇到,下面会说到。这两处设置缺一不可。

三. 创建并编辑uwsgi.ini

在settings.py的同级目录中创建uwsgi.ini文件(这个文件主要是为了将Django项目和Nginx联通,并且对项目做一些运行环境的配置),然后进行如下编辑:

# myweb_uwsgi.ini file
[uwsgi]

# Django-related settings
socket = 127.0.0.1:8000
#http = 0.0.0.0:8000

# the base directory (full path)
chdir           = /root/django-projects/myserver

# Django s wsgi file
wsgi-file 	        = /root/django-projects/myserver/myserver/wsgi.py

# process-related settings
master          = true

# maximum number of worker processes
processes       = 4

#threads number
threads	       = 2

#pid log file
pidfile		= 	uwsgi.pid

#log output file, if not set, the log will output to console
#daemonize=uwsgi.log

# clear environment on exit
vacuum          = true

#auto restart when detecting phthon code change
py-autoreload = 1

注意:文件里的socket地址127.0.0.1:8000必须和后面配置的Nginx配置文件里的地址保持一致

四. 配置Nginx

1. 在etc/nginx/目录下,编辑nginx.conf文件,只需要改一点:

将 user www-data; 改为 user root; 即可

2. 在etc/nginx/sites-enabled/目录下,编辑default文件(我将主要的修改内容放在这个文件里了),文件内容如下:

# myserver configuration
#
server {
	listen 80;
	listen [::]:80;

	server_name 你服务器的IP地址;

	#定义nginx log的保持文件,需要先建一下目录,不然nginx会报错
    access_log  /root/django-projects/myserver/logs/access.log;
    error_log   /root/django-projects/myserver/logs/error.log;

    location / {
        # 监听 8000 端口,与 uwsgi.ini 里的 socket 设置成同一个端口
     	uwsgi_pass 127.0.0.1:8000;
        include uwsgi_params;
    }

    location /static {
        # 静态文件目录,STATIC_ROOT 指定的目录
        alias /root/django-projects/myserver/static_root;
    }

}

配置完成,运行:/etc/init.d/nginx start ,启动Nginx

到这里你的Nginx应该已经开始提供服务了,你在浏览器里访问你的主机,应该会看到Nginx的欢迎界面了。

五. 启动uwsgi服务

去uwsgi.ini所在目录下运行:uwsgi --ini uwsgi.ini,启动uwsgi

(如果没有装uwsgi,先通过pip install uwsgi安装即可)

如果顺利的话,你的网站应该可以正常访问了。如果有问题,再仔细对照上面的步骤检查一下吧。

有问题可以给我留言。

其他问题记录:

------------------------------------------------------

2023/4/7:今天在一个新服务器上跑,遇到一个新问题:运行uwsgi --ini uwsgi.ini时,提示ModuleNotFoundError: No module named django,网上搜了一下,貌似是因为python的site-packages目录不在系统环境变量里(但是我们之前的服务器也没有这个,就没有问题),于是依葫芦画瓢,问题是得到了解决。具体有两种方式:

1. 修改系统环境变量:

在/etc/bash.bashrc文件最后一行加上一句:

export PATH=/home/ubuntu/.local/lib/python3.8/site-packages:$PATH

保存后,需要执行 source /etc/bash.bashrc让新的环境变量生效

2. 直接在django项目文件中添加环境变量语句:

分别在wsgi.py 和 manage.py文件中加如下语句,

sys.path.append('/home/ubuntu/.local/lib/python3.8/site-packages')

2024/3/9:今天在一个新服务器上跑,遇到一个新问题:运行uwsgi --ini uwsgi.ini时,提示

"no request plugin is loaded, you will not be able to manage requests.
you may need to install the package for your language of choice, or simply load it with --plugin"

解决办法是安装plugin:

apt-get install uwsgi-plugin-python3 

然后在uwsgi.ini中加入两句话:

plugins-dir = /usr/lib/uwsgi/plugins

plugins = python3

再次运行uwsgi --ini uwsgi.ini,问题解决。

六. 域名解析

首先你需要注册并购买一个域名(具体不展开了)

打开腾讯云,按以下步骤操作:

 域名注册 --> 我的域名 --> 点击你的域名 --> 基本信息 --> 解析 --> 添加记录,如下:

主要是要添加@和www两个类型的记录,将你自己的主机IP填进去

然后在DNS解析里启用DNS服务即可。

七. 部署SSL证书,启用HTTPS访问

主要过程参考这篇文章就可以了:

SSL 证书 Nginx 服务器 SSL 证书安装部署-证书安装-文档中心-腾讯云

主要步骤如下:

1. 在云控制台申请SSL证书

2. 从云控制台下载证书,upload证书文件到云主机的/etc/nginx 目录(此处为 Nginx 默认安装目录,请根据实际情况操作)

3. 修改Nginx配置文件,我是在/etc/nginx/sites-enabled/default里修改的。主要就是把80端口切换成https专用的443端口,还有做一些SSL相关的配置

# myserver configuration
#
server {
        #listen 80;
        #listen [::]:80;
 
        #定义nginx log的保持文件,需要先建一下目录,不然nginx会报错
        access_log  /home/ubuntu/nginx-logs/access.log;
        error_log   /home/ubuntu/nginx-logs/error.log;
 
        location / {
                # 监听 8000 端口,与 uwsgi.ini 里的 socket 设置成同一个端口
                uwsgi_pass 127.0.0.1:8000;
                include uwsgi_params;
        }
 
        location /static {
                # 静态文件目录,STATIC_ROOT 指定的目录
                alias /home/ubuntu/myserver/static_root;
        }
 
        location /media {
                # 媒体文件目录,MEDIA_ROOT 指定的目录
                alias /home/ubuntu/myserver/media;
        }
 
         #SSL 访问端口号为 443
         listen 443 ssl;
        #填写绑定证书的域名
         server_name 填写你的域名或主机IP地址;
        #启用 SSL 功能
         #ssl on;
         #证书文件名称
         ssl_certificate 你的证书的crt文件;
         #私钥文件名称
         ssl_certificate_key 你的证书的key文件;
 
         ssl_session_timeout 5m;
         #请按照以下协议配置
         ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
         #请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
         ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; 
         ssl_prefer_server_ciphers on;
 
}
 
#将http访问转到https访问
server {
 listen 80;
 #请填写绑定证书的域名
 server_name 101.133.142.252; 
 #把http的域名请求转成https
 return 301 https://$host$request_uri; 
}
 

到此,一个完整的HTTPS云端服务可以正常访问了。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

穿越光年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值