参考:https://www.cnblogs.com/zhming26/p/6158660.html
前言:
该种部署方式中nginx接收Web的所有请求,其中所有的静态请求由nginx来处理,所有的非静态请求通过uwsgi传递给Django,由Django来进行处理,从而完成一次WEB请求。
1. 测试部署环境
- 操作系统debian 10
- python3.7
- django2.2
2. 安装 nginx 及配置
2.1 切换到 root 权限,安装
apt-get install nginx
2.2 添加对应网站的配置文件和测试内容
vim /etc/nginx/conf.d/wj.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
server {
listen 8088; # 修改端口号
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
}
|
2.3 重启 nginx 服务
service nginx restart
3. python3.7 安装 uwsgi
3.1 解决报错
1
2
3
|
sudo apt install python3.7-dev
pip3 install uwsgi --upgrade
|
3.2 测试 uwsgi,创建 test.py 文件
1
2
3
|
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"]
|
3.3 通过 uwsgi 测试运行该文件
uwsgi --http :8001 --wsgi-file ./test.py
Tips:(以下内容仅作参考不做配置也可以,关闭服务时 ctrl+c 即可)
- 可在项目根目录下新建两个文件wj_uwsgi.pid和wj_uwsgi.status,一个记录pid号方便重启和停止服务,一个记录服务运行状态。
- 修改你的uwsgi配置文件,wj_uwsgi.ini文件添加以下配置:
1
2
|
stats=%(chdir)/wj_uwsgi.status
pidfile=%(chdir)/wj_uwsgi.pid
|
- 以后通过uwsgi启动wj_uwsgi.ini文件,就会在.pid和.status文件内记录内容,启动、重启、停止uwsgi:
1
2
3
4
5
6
|
# 启动:
uwsgi --ini xxx.ini
# 重启:
uwsgi --reload xxx.pid
# 停止:
uwsgi --stop xxx.pid
|
4. 配置 Django 与 uwsgi 连接
django项目位置为:/home/mycode/webshellCheck
4.1 在项目根目录 webshellCheck 下新建 wj_uwsgi.ini 文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
# wj_uwsgi file
[uwsgi]
# Django-related settings
socket = 127.0.0.1:9000
# the base directory (full path)
chdir = /home/mycode/webshellCheck
# Django s wsgi file
module = webshellCheck.wsgi
# process-related settings
# master
master = true
# maximum number of worker processes
processes = 4
# ... with appropriate permissions - may be needed
# chmod-socket = 664
# clear environment on exit
vacuum = true
|
注:
- socket 指定项目执行的端口号。
- chdir 指定项目的目录。
- module webshellCheck.wsgi ,可以这么来理解,对于wj_uwsgi.ini文件来说,与它的平级的有一个webshellCheck目录,这个目录下有一个wsgi.py文件。
4.2 在项目目录下通过 uwsgi 命令读取 wj_uwsgi.ini 文件启动项目
uwsgi --ini ./wj_uwsgi.ini
4.3 修改 nginx.conf 配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
server {
listen 8099;
server_name 127.0.0.1
charset UTF-8;
access_log /var/log/nginx/wj_access.log;
error_log /var/log/nginx/wj_error.log;
client_max_body_size 75M;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:9000;
uwsgi_read_timeout 2;
}
location /static {
expires 30d;
autoindex on;
add_header Cache-Control private;
alias /home/mycode/webshellCheck/frontend/dist/static;
}
}
|
4.4 重启 nginx,然后启动 uwsgi
1
2
3
|
service nginx restart
uwsgi --ini ./wj_uwsgi.ini
|
4.5 在浏览器测试访问:localhost:8099
uwsgi启动成功日志:
5. 生产环境配置:Django debug=False+关闭django自带的admin后台
5.1 静态文件配置
关于本项目中前端打包的静态文件放在项目根目录下的frontend/dist/static路径下,部署到生产环境中需要将debug设置为false,静态文件相关配置如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
......
DEBUG = False # 修改
ALLOWED_HOSTS = ['*', ] # 允许所有域名访问
STATIC_URL = '/static/' # 静态路由映射,别名设置,django利用STATIC_URL来让浏览器可以直接访问静态文件
STATICFILES_DIRS = [ # 公共文件夹的静态文件路由配置
os.path.join(BASE_DIR, "frontend/dist/static"),
]
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
# 'DIRS': [],
'DIRS': ['frontend/dist/static'], # 模板文件的路径设置
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
......
|
5.2 关闭 django 自带的 admin 后台,主 urls.py 的配置
1
2
3
4
5
6
7
8
9
10
|
from django.contrib import admin
from django.urls import path, include
from django.views.generic import TemplateView
urlpatterns = [
# path('admin/', admin.site.urls), # 生产环境下建议可关闭django自带的后台管理
path('', TemplateView.as_view(template_name="index.html")), # 首页模板调用路径
path('users/', include('wscheck.urls'))
]
|
Django关闭DEBUG模式后,就相当于是生产环境了,Django官网上指出如果是django框架一旦作为生产环境,那么它的静态文件访问接口就不应该从Django框架中走了,应该有独立的web环境,首推nginx 。在开发过程中,开发人员在框架的根目录下创建一个static目录,目录在根据里面有几个APP创建对应APP程序静态文件目录。但是一旦放到生产环境(也就是关闭掉DEBUG模式),你在nginx中就要单独做访问/static/目录的路由。
5.3 存在多个应用内的静态文件时的配置
这里由于只有一个应用的静态文件需要加载,所以注意nginx的配置中项目运行需要加载的静态文件就是一个绝对路径,上面关于静态文件的配置完全可以满足本项目的需求。而当该项目下不止一个app且每个app下都有独立的静态文件的时候,我们就需要将所有的静态文件都统一放到一个目录下。django提供了一个比较方便的方法:
(1)在上述例子的静态文件配置的基础上,settings.py中配置一个静态目录的根目录:STATIC_ROOT
1
|
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') # 注意staticfiles可以是其他名称,但是不要和STATICFILES_DIRS设置的名称重复
|
(2)然后在项目根目录下执行以下命令,可将项目下所有的静态资源统一复制到STATIC_ROOT目录下
1
|
root@debian:/home/mycode/webshellCheck# python3 manage.py collectstatic
|
执行完命令可以看到在项目根目录下多了一个带锁图标的staticfiles文件夹,记得赋予该目录权限:
chmod 777 staticfiles -R
(3)修改nginx配置中的静态文件路径,将该行 alias /home/mycode/webshellCheck/frontend/dist/static;更改为:
alias /home/mycode/webshellCheck/staticfiles;
重启nginx,启动uwsgi,在浏览器测试运行成功!
尝试在浏览器输入 localhost:8090/不存在的路径不会出现暴露部分路径的debug信息,尝试输入 localhost:8090/admin提示不存在。✌️😆✌️