nginx 是一个市面上流行的服务器软件,它的主要功能有:作为静态资源的 web 服务器、反向代理、负载均衡。
nginx + uwsgi 部署 django 应用的原理
我们将从用户输入 url 开始,用一个完整的例子过一遍 nginx + uwsgi 部署 django 应用时背后发生的一系列故事。
用户在客户端(浏览器)中输入域名example.com
,example.com
经过 DNS 域名解析变成 ip 地址 12.34.56.78
。于是客户端会与该 ip 地址进行三次握手,然后发送 http 请求,假设请求的路径是/home/
。
假定服务器上安装并运行了 nginx,且配置文件nginx.conf
的内容如下所示:
server {
listen 80;
server_name example.com;
# 静态文件处理
location /static/ {
alias /var/www/static/; # 指向静态文件目录
}
# 动态请求处理
location / {
include uwsgi_params; # 包含 uWSGI 的参数
uwsgi_pass 127.0.0.1:8001; # 转发请求到 uWSGI 监听的地址
}
}
listen 80;
: 即监听 80 端口,http 请求默认会抵达 80 端口location /static/
: 如果请求路径以/static/
返回,则 nginx 会直接从指定的静态资源目录加载文件并返回location /
: 如果上述规则不匹配(请求的不是静态资源),则 nginx 会将请求转发给运行在本地127.0.0.1:8001
的 uwsgi 服务
uwsgi 是 nginx 与 django 之间的桥梁,它接收 nginx 发送的请求并将其转发给 django 进行处理。进入到 django 项目中manage.py
所在文件夹,执行uwsgi --http :8001 --module mysite.wsgi
来启动 django 项目并监听 8001 端口,nginx 将会把请求转发到这个端口。
于是请求就通过 uwsgi 成功来到了 django 中,django 根据定义的路由匹配规则和视图,处理/home/
并将响应返回给 uwsgi,uwsgi 封装之后再交给 nginx,nginx 再将其返回给客户端。
正向代理与反向代理
先给出一个表格总结二者的不同:
正向代理 (Forward Proxy) | 反向代理 (Reverse Proxy) | |
---|---|---|
作用 | 代理客户端发送请求 | 代理服务器接收请求 |
服务对象 | 客户端 | 服务器 |
隐藏的对象 | 隐藏客户端 | 隐藏服务器 |
示例应用 | VPN、Shadowsocks 等 | Nginx、Apache等 |
客户端是否知道目标服务器 | 客户端知道目标服务器地址 | 客户端不知道目标服务器地址 |
典型场景 | 当用户访问受限,无法访问 google 时,通过正向代理服务(如 VPN),就能够将请求先发送到代理服务器,然后由代理服务器转发请求给 google | 通常而言企业的网站流量很高,有多台后端服务器负责处理请求。把 Nginx 作为反向代理,客户端请求会先到 Nginx,然后由 Nginx 按照负载均衡算法将请求分发给后端服务器 |
举个形象化的例子你就明白二者的区别了:
正向代理:
假如 A 喜欢 C,但是 A 比较怂不敢当面给 C 表白,恰好 A 知道自己有一个和 C 共同的朋友 B,于是就托 B 告诉 C:“我有一个好朋友喜欢你,托我向你表白,这是他托我给你的花。” C 见状,直接拒绝,心想,好家伙,连表白都托别人来表,这种人我怎么可能答应。
回顾上面的整个过程,A 就好像客户端,C 是服务器,B 是正向代理服务器。A 知道自己要表白的对象是 C,而 C 甚至都不知道(这种情况下确实也不需要知道,大家表白还是要鼓起勇气自己去哇)真正向自己发起请求的人是谁,只知道它是借助 B 来向自己发起请求的。
所以正向代理的作用就是代理客户端发起请求,它向服务端隐藏了真正的客户端,而客户端是知道目标服务器的。
反向代理:
A 始终没能战胜心魔当面表白,在 TA 之后再也没有遇到自己喜欢的人,于是只能寄希望于婚恋市场。这天,A 进入一家相亲所 D,向前台投递了自己的简历和预期对象。D 按照筛选流程从众多候选人中找到了可能合适的人 E,E 把自己的意愿告诉给 D,再由 D 转交给 A。
在上面这个过程中,A 依然是客户端,E 是服务器,D 是反向代理服务器。A 不知道 D 会把自己的请求发送给哪个人,这就对应了反向代理能够向客户端隐藏目标服务器,它代表目标服务器来接受客户端的请求。
Mac 上 nginx 相关命令
# 安装 nginx
brew install nginx
# 启动 nginx
brew services start nginx
# 关闭 nginx
brew services stop nginx
# 重启 nginx
brew services restart nginx
使用brew info nginx
查看用 homebrew 安装的 nginx 的配置文件的默认地址为:/opt/homebrew/etc/nginx/nginx.conf
通常而言修改了nginx.conf
文件后,需要执行ngxin -t
来测试修改后的文件是否有误,同时还能够查看 nginx 配置文件的路径;若无误则执行nginx -s reload
来重新加载配置文件。