Windows下Nginx代理Django项目

Windows下Nginx代理Django项目

django部署到本机网络上后,出现了音频无法快进,进度条无法拖动的问题。原因是前端请求音频文件不是通过后端的api,而是直接用require方法,这样做后端的响应没有包含 Content-Range 或者 Accept-Ranges Header。解决方法有两种:

  1. 让django响应静态文件请求时有响应头(即前端通过api请求静态文件,该方法要修改前端,还要在后端单独写方法处理请求)。

  2. 用nginx服务器处理静态文件。

考虑将来部署到linux服务器上也需要用nginx,以及实现的难度,我采用第二种方法,即在windows下用nginx处理django项目的静态文件请求。

值得一提的是,大多数django项目部署都需要用到uwsgi和nginx,然而在windows环境下,uwsgi无法下载(或者说使用的代价太大),因此windows下还是简单部署为好,实际项目使用还是需要在linux下。

nginx目的

我们使用nginx的目的是帮助django处理静态文件,nginx起到代理的作用。因此,我们要做的是:

  1. 对于静态文件请求,nginx直接处理,无需交与django

  2. 对于后端api接口请求,nginx交与django处理

重点:nginx监听的端口和django部署的端口不能是同一个端口

两个程序不能监听同一个端口,这样做会出现有的静态文件通过nginx而有的则通过django的问题。

因此,我们访问项目也不再是django项目部署的端口,而是nginx监听的端口,前端同样是向nginx监听的端口发送api接口请求。

nginx下载

nginx: download官网下载stable version的windows版本并解压。

nginx配置

在解压后的conf文件夹中,修改nginx.conf文件,主要修改http中的server:

  1. listen端口号改为浏览器访问项目的端口号;

  2. server_name改为django项目部署的ipv4地址;

  3. 添加location /app(注册的app名称)将前端发送的api请求转发给后端;

  4. 添加location /static/处理前端的静态文件请求。

注意:路径一定要正确,用 “/” 而不是 “\” 。

有关location的root、alias、路径末尾是否加 “/” 的问题,参考Nginx之location详解

前端的api请求应转发给后端,因为nginx是不允许静态资源请求使用POST方法的,若通过nginx处理POST请求会报错,解决方法较复杂。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
server {
listen 8000; # nginx监听端口号,即实际访问项目的端口号
server_name x.x.x.x; # django项目部署的ipv4地址
#charset koi8-r;

# location / {
# root django项目根目录(manage.py所在目录)在电脑上的绝对路径(末尾需加/);
# index /templates/index.html;
# }

location /app {
proxy_pass http://x.x.x.x:8001; # django项目部署的ipv4地址与端口号(前面需加上http://)
}

location /static/ {
root django项目根目录(manage.py所在目录)在电脑上的绝对路径(末尾需加/);
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}

}

nginx命令

nginx常用的命令如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 在nginx根目录下cmd
# 启动
start nginx
# 检查配置文件
nginx.exe -t
# 安全停止
nginx.exe -s quit
# 立即停止,可能不保存相关信息
nginx.exe -s stop
# 指定配置文件启动(?)
nginx.exe -c ./conf/nginx.conf
# 启动后,重新加载配置
nginx.exe -s reload

指定配置文件启动命令似乎不行,使用后cmd卡死。

当nginx启动失败或报错后,需要手动在任务管理器关闭进程,此时使用命令并不能真正关闭进程。

启动nginx运行django

先启动nginx,启动成功后,运行django。

访问项目时浏览器地址输入的端口号为nginx监听的端口号。

在浏览器开发者工具的网络里可以查看前端发送的请求,其中server为nginx。


Windows下Nginx代理Django项目
https://wangaaayu.github.io/blog/posts/f0bd5174/
作者
WangAaayu
发布于
2023年5月13日
更新于
2023年6月6日
许可协议