官方中文文档
前提工作:Nginx安装完毕并可正常运行,项目也能正常运行。
需求说明:将项目运行在不同的端口上,如8000、8001、8002,使用nginx反向代理和负载均衡,假设机器ip为 192.168.133.128
一、nginx有一个默认的文件夹conf.d,全局配置文件中include了这个文件夹里面的*.conf文件,在conf.d里新建一个nginx的配置文件,如 proxy.conf
二、在proxy.conf中如下配置
# 负载均衡(默认会轮训(按顺序)分配访问者)
upstream meiduo {
# 默认轮训
# server 192.168.133.128:8000;
# server 192.168.133.128:8001;
# server 192.168.133.128:8002;
# 加权轮训(权重weight大的优先调用)
# server 192.168.133.128:8000 weight=1;
# server 192.168.133.128:8001 weight=2;
# server 192.168.133.128:8002 weight=3;
# ip_hash 第一次请求会分配一个服务端的ip,以后的所有请求都是使用第一次的服务端的ip,
# 比如第一次访问了8001,则以后的请求都会访问该ip
ip_sh;
server 192.168.133.128:8000;
server 192.168.133.128:8001;
server 192.168.133.128:8002;
}
# 反向代理(为web服务器选择不同的项目接待访问者)
server {
listen 192.168.133.128:80;
location / { # / 表示匹配url的根路径
proxy_pass http://meiduo; # 需要在web服务meiduo前加上http://
}
}
server {
listen 192.168.133.128:8000;
location / {
root /etc/nginx/html;
index 8000.html;
}
}
server {
listen 192.168.133.128:8001;
location / {
root /etc/nginx/html;
index 8001.html;
}
}
server {
listen 192.168.133.128:8002;
location / {
root /etc/nginx/html;
index 8002.html;
}
}
# 补充说明:这里的例子中,作为负载均衡的每一个单独server都配置了html文件,实际工作中,将项目运行在多个不同的 ip:端口 上(比如使用uwsgi),upstream配置段中设置好对应的server即可,只有静态页面如首页、商品详情页等,在开端监听80端口server中设置location匹配index或者商品详情页即可,其他location则转发到下面的server。
三、执行命令 nginx -t 检测配置文件是否有误;
执行命令 nginx -s reload 重新加载配置文件;
完成,打开浏览器访问即可。
实例演练过程:
场景:使用uwsgi部署多个美多商城前台在云服务器的多个端口上(8000、8001、8002、8003),使用nginx监听80端口,将访问者的请求频率一致地内部转发到这四个端口(即四个端口的权重一致),转发前匹配访问者的请求路径,若请求路径的是静态资源时,如index.html和商品详情页,则return返回指定页面。
注意nginx默认监听80端口,相关配置代码并不是在 /etc/nginx/nginx.conf 而是在 /etc/nginx/sites-enabled/default 中,想要访问者访问80端口,nginx进行负载均衡内部转发到多个端口上(8000、8001、8002、8003),可以在 /etc/nginx/sites-enabled/default 中的location配置段加上转发到云服务器的公网ip和端口的操作,如 proxy_pass http://公网ip:7999,在 /etc/nginx/nginx.conf 包含的下级 *.conf 类的某个文件中,监听7999端口再转发到8000、80001等即可,详细代码如下;
/etc/nginx/sites-enabled/default 的location 配置段,可能有两个server段,这里找第二个
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
# try_files $uri $uri/ =404;
proxy_pass http://82.156.32.89:7999/;
}
*.conf 之类的文件内,如 meiduo.conf中
upstream meiduo{ # 可以加上权重 server 172.21.0.16:8000 weight=1;
server 172.21.0.16:8000; # 权重可以不一样,但要么都有要么都没有
server 172.21.0.16:8001;
server 172.21.0.16:8002;
server 172.21.0.16:8003;
}
server {
listen 7999;
location / {
proxy_pass http://meiduo;
}
}
上面的演练完成后,使用uwsgi部署多个项目在不同端口上,使用nginx对来访者负载均衡,分配到各个端口上,但来访者看到的网页缺少css等静态文件,接下来还需要收集项目中的静态文件到一个文件夹中,供nginx在匹配/static路由时,处理涉及到的css等静态文件。
中的第8步,参考文章的nginx的server配置放在 nginx.conf内
实际操作过程如下:
1. 在负载均衡内部转发给各个端口之前,即监听7999的时候,在该server中添加新的location如下
# 这里是在meiduo.conf中
server {
listen 7999;
...
location /static {
alias /var/www/execution/static;
}
}
# nginx配置文件有更改记得执行 nginx -t 检测和执行 nginx -s reload 重新加载
2. 在云服务器上创建目录 /var/www/execution/ ,修改它的权限
sudo chmod 777 /var/www/execution
3. 修改权限后在里面 mkdir static 创建static目录
4. 修改settings.py文件,根据实际业务,如果是settings.prod.py用于生产,settings.dev.py用于开发,则一般修改 settings.prod.py,具体修改如下:
STATIC_ROOT='/var/www/execution/static/' STATIC_URL='/static/'
# 一般开发时已设置了STATIC_URL,STATIC_ROOT就放在一起
5. 执行命令 python manage.py collectstatic 收集所有静态文件到上面 STATIC_ROOT 指定的目录,注意该操作需要用到该项目的包,云服务器上(即生产服务器上)的包前面已经都放在了虚拟环境中,因此还需要先进入虚拟环境中再进行该操作。
6. 访问者刷新浏览器页面,现在css等静态文件已经能加载了。(修改了云服务器上的manage.py代码,记得执行命令 git status、 git add . 、 git commit -m "描述信息" 、 git push)
备注:uwsgi 启动django项目的命令
uwsgi --http :端口号 --ini uwsgi.ini
应该也写入开机脚本中,提高效率。
追记:不经由端口80到端口7999到各端口,而是直接访问8000、8001等端口,依旧不会正确加载css等静态文件。
常见问题:
1. nginx -t 后报错,查看*.conf文件的配置,是否配置了重复的端口(不同文件内不能配置相同端口,同一文件内也不能配置相同端口)
建议在conf.d内建一个old文件夹放置各种旧版本的*.conf文件,避免重复配置了端口。
2. nginx -s reload 后报错 nginx: [error] invalid PID number "" in "/run/nginx.pid"
执行 nginx -t 是OK的,然而在执行 nginx -s reload 的时候报错
nginx: [error] invalid PID number "" in "/run/nginx.pid"
解决参考:
需要先执行
nginx -c /etc/nginx/nginx.conf # 提示端口被占用则先杀掉占用端口的原nginx
nginx.conf文件的路径可以从nginx -t的返回中找到。
nginx -s reload