记录一下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 退出调试
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 即为生效
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欢迎界面 即为成功
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欢迎界面 即为成功
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的配置文件后,按照配置文件启动应该不会出现此问题。