Loading

记录一下Debian + Django + Nginx环境搭建过程以及遇到的一些问题

1.安装Django

1.首先更新一下自己的系统软件

apt update
apt upgrade -y

2.安装python虚拟环境,并切换到自己工作的目录

sudo apt install -y python3-venv
cd /home/bysj

3.在当前目录下创建虚拟环境venv,并进入虚拟环境

python -m venv ./venv
source ./venv/bin/activate

此时应出现形如: (venv) root@VM-0-11-debian:~#
4.安装django 3.2.9

pip install django==3.2.9

5.在当前目录下创建django项目"bysj"

django-admin startproject bysj

6.修改项目默认设置 (此处涉及到Django默认项目Static404问题,请结合Django新建默认项目中,Static文件404的解决办法 - DouSTN - 博客园 (cnblogs.com)设置)

nano ./bysj/bysj/settings.py

...
ALLOWED_HOSTS = ['*']
TIME_ZONE = 'Asia/Shanghai'

#下面和Static 404有关,可以先不设置
STATIC_ROOT='/home/bysj/venv/lib/python3.10/site-packages/django/contrib/admin/static'
...

6.进入项目,运行调试

cd bysj
python manage.py runserver 0.0.0.0:9000

打开浏览器输入 主机IP地址:9000,出现小火箭即为成功,按下 ctrl+z 退出调试
image


2.安装uWSGI

1.安装 **wheel **和 uwsgi(注意仍需要在venv虚拟环境中 以及 自身工作目录下 安装)

pip install wheel
pip install uwsgi

2.测试uwsgi

uwsgi --http :9001 --module bysj.wsgi

再次打开浏览器,输入 主机IP地址:9001,再次出现小火箭即为成功,按下 ctrl+z 退出调试


3.安装NGINX

1.安装Nginx(仍确保在虚拟环境下)

sudo apt install nginx -y

2.测试nginx
打开浏览器,输入 主机IP地址,出现欢迎界面即为成功


4.配置相关环境

Nginx配置

1.创建Nginx配置文件

在当前项目文件夹下新建 uwsgi 文件夹(忘记的可以在 安装Django的第2步查看

cd /home/bysj
mkdir uwsgi
nano ./uwsgi/bysj.conf

bysj.conf的内容:(此处涉及到Django默认项目Static404问题,请结合Django新建默认项目中,Static文件404的解决办法 - DouSTN - 博客园 (cnblogs.com)设置)

server {
    listen 80;
    server_name YOUR_IP; #根据主机实际IP地址或域名进行替换
    charset utf-8;

    location / {
        # 将80端口指向本地的8011端口
        uwsgi_pass 127.0.0.1:8011;
        include /etc/nginx/uwsgi_params;
    }
    
    #下面和Static 404有关,可以先不设置
    location /static {
	alias /home/bysj/venv/lib/python3.10/site-packages/django/contrib/admin/static/;
	}
}

2.为配置文件软链接到Nginx

将配置文件软链接到Nginx配置文件夹下,检查是否有语法错误,并重启Nginx

(venv) root@VM-0-11-debian:/home/bysj# sudo ln -s /home/bysj/uwsgi/bysj.conf /etc/nginx/sites-enabled/
(venv) root@VM-0-11-debian:/home/bysj# sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
(venv) root@VM-0-11-debian:/home/bysj# sudo /etc/init.d/nginx restart
Restarting nginx (via systemctl): nginx.service.

3.测试配置文件是否生效

打开浏览器,输入服务器IP地址,此时由欢迎界面变成 502 Bad Gateway 即为生效

image-20211206185456676

uWSGI配置

1.创建uWSGI配置文件

uwsgi 文件夹内创建 bysj.ini

(venv) root@VM-0-11-debian:/home/bysj# cd uwsgi
(venv) root@VM-0-11-debian:/home/bysj/uwsgi# nano bysj.ini

bysj.ini 内容如下:

[uwsgi]
# 对应nginx里,80端口指向的8011端口
socket = :8011
module = bysj.wsgi
master = True
processes = 2
threads = 2
vacuum = true
pidfile = /home/bysj/uwsgi/bysj.pid #选择存放pid文件的位置
daemonize = /home/bysj/uwsgi/bysj.log #选择存放log文件的位置
uid = www-data
gid = www-data
home = /home/bysj/venv #选择虚拟环境所在的文件夹
chdir = /home/bysj/bysj #选择Django项目所在文件夹
chown-socket = www-data:www-data
chmod-socket = 664

2.启动uWSGI

(venv) root@VM-0-11-debian:/home/bysj/uwsgi# uwsgi --ini /home/bysj/uwsgi/bysj.ini
[uWSGI] getting INI configuration from /home/tql-bysj/uwsgi/bysj.ini

3.测试配置文件是否生效

用浏览器打开 服务器IP地址 ,出现 Django欢迎界面 即为成功

image-20211206201219583

4.设置开机自启动

1.确定uWSGI的绝对路径

进入虚拟环境中,使用which uwsgi确uWSGI的绝对路径

(venv) root@VM-0-11-debian:~# which uwsgi
/home/bysj/venv/bin/uwsgi

2.添加自启动命令

首先使用 deactivate 命令退出虚拟环境

(venv) root@VM-0-11-debian:~# deactivate
root@VM-0-11-debian:~# 

使用systemctl status rc-local确定 rc-local 服务是否启动

root@VM-0-11-debian:~# systemctl status rc-local
● rc-local.service - /etc/rc.local Compatibility
    ……
	……
     Active: active (exited) since Mon 2021-12-06 20:46:56 HKT; 13min ago
	……
    Process: 574 ExecStart=/etc/rc.local start (code=exited, status=0/SUCCESS)

若显示 Active: active 即为已启动。继续编辑 rc.local 文件,跳过 给予权限并启动rc.local服务 步骤

若显示 Active: inactive (dead) 则没有启动,需要手动添加 rc.local 文件

nano /etc/rc.local

#下面是需要添加到 /etc/rc.local 里的内容
#!/bin/bash
/home/bysj/venv/bin/uwsgi --ini /home/bysj/uwsgi/bysj.ini
exit 0

以后如果有其他要自启动运行的脚本,只需要放在 exit 0 前面即可

接下来给予权限并启动 rc.local 服务

chmod +x /etc/rc.local
systemctl start rc-local

3.测试自启动配置是否生效

重启服务器后,用浏览器打开 服务器IP地址 ,出现 Django欢迎界面 即为成功

image-20211206201219583

5.常见问题

1.安装uwsgi后,测试项目时出现 No module named 'xxx'

在安装好uwsgi后,运行uwsgi --http :9001 --module bysj.wsgi进行测试时,会出现以下报错:

ModuleNotFoundError: No module named 'bysj.wsgi'
unable to load app 0 (mountpoint='') (callable not found or import error)
*** no app loaded. going in full dynamic mode ***

且此时浏览器打开 IP:9001 会出现 Internal Server Error

解决办法:

可能是由于虚拟环境导致的,可以暂时略过。按照流程配置uWSGI的配置文件后,按照配置文件启动应该不会出现此问题。

参考链接

  1. 木村戒奶:debian10搭建django+uwsgi+nginx网站(上)_Macau Fish的专栏-CSDN博客
  2. 木村戒奶:debian10搭建django+uwsgi+nginx网站(下)_Macau Fish的专栏-CSDN博客
  3. 夜桜家:Debian 9 启用 /etc/rc.local 添加开机自动执行命令 – 夜桜家 (yeying.org)
posted @ 2021-11-21 21:40  DouSTN  阅读(271)  评论(0编辑  收藏  举报