Nginx 使用反向代理和负载均衡运行项目

官方中文文档

www.nginx.cn/doc/

 

前提工作: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等静态文件。

参考:https://blog.csdn.net/qq_35318838/article/details/79531566?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control

中的第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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值