Nginx:反向代理服务器常用功能汇总【不断更新~】
创始人
2024-09-25 04:24:15
0

       在这篇文章中,我会通过自己在工作中不多摸索、实践,总结一些经常会用到的Nginx功能,包括反向代理、负载均衡等一些比较出色的功能的使用,文章不定期会更新,有需要的小伙伴可以先收藏起来哈,话不多说,那我们现在开始。

       首先我们来大概介绍一下文章流程,开篇我们先介绍一下如何安装Nginx,然后就进入文章的关键环节,配置nginx.conf配置文件,实现对应需求的反向代理功能。

一、前期准备

       不管是windows还是Linux,亦或者是MacOS,都可以比较方便的安装上Nginx,很简单,网上也有很多安装教程,小编就不在这里一一例举了;小编在公用电脑尝试了Windows系统的安装使用,也在自己电脑尝试的在ubuntu系统的docker容器中搭建Nginx,相比较而言感觉windows的还是比较简单的,MacOS一般采用brew安装工具进行安装,由于小编网络原因,brew的镜像库无法更新,就放弃了MacOS版本的测试,小伙伴们可以自行尝试,欢迎留言分享经验哈~

       那这里我们就以ubuntu系统的安装使用为例,搭建Server端、Client端,配置nginx.conf,实现不同需求和不同场景下的反向代理。

1.1 安装Nginx

       因为我自己的电脑是MacOS系统,所以我选择在ubuntu系统的docker容器中完成前期的准备工作,如果自己的电脑本来就是Linux系统的,并且在物理机安装Nginx也不会有什么影响的,还是建议直接在物理机进行安装,可以省去很多软件工具的安装,这里就跳过docker部署ubuntu系统的流程,直接进行Nginx的安装;

1.1.1 更新包列表

       首先尝试更新你的包列表,以确保你能找到最新的软件包信息。在终端中执行(权限不够记得sudo哦):

apt update

1.1.2 安装Nginx

apt install nginx

1.1.3 确认状态

       安装完成后,你可以检查Nginx服务的状态以确认它是否已经启动:

systemctl status nginx

1.1.4 Nginx启停

       如果Nginx处于启动状态就先停掉:

# 停止命令 systemctl stop nginx # 启动命令 systemctl start nginx

1.2 创建服务端和客户端

       因为Nginx起到的是一个承前启后的中介工作,客户端、Nginx和服务端他们的关系是客户端发出请求,请求被Nginx接收到,然后Nginx根据请求类型进行分析,将对应的请求分配给对应的服务端服务器上进行处理,服务端将处理的结果返回给Nginx,再由Nginx将处理结果给回客户端;这样做的好处是客户端不直接对接服务端,对服务端有一定的信息保护作用,其次Nginx会根据后端服务器的资源合理分配请求,提高请求处理效率和鲁棒性;

1.2.1 创建服务端

       这里我简单写了一个python脚本,使用Flask启动一个web服务,接收请求发送来的图片URL地址,读取图片做进一步操作;在这段代码中,我们需要明确的是:

1)采用广播域IP,假设该服务器IP为192.168.20.10;

2)暴露端口为8080;

3)路由为‘/function1’;

也就是如果要访问到这个web服务,需要和这个服务器在同一个局域网内,请求链接为‘http://192.168.20.10:8080/function1’;

# Server.py from flask import Flask, request, jsonify  app = Flask(__name__)  def get_img(url):     pass   @app.route('/function1', methods=['POST']) def receive_data():     # 获取 JSON 数据     try:         data = request.get_json()         url = data['url']         print(url)         # 打印接收到的数据         print("Received data:", data)         result = get_img(url)         # 返回确认信息         return jsonify({"message": "Data received successfully!", "received_data": result}),200     except:         return jsonify({"message": "Data received fail!", "received_data": 404})   if __name__ == '__main__':     app.run(host='0.0.0.0', port=8080, debug=False)

 1.2.2 配置Nginx参数

       Nginx的配置文件一般放置在/etc/nginx/nginx.conf,打开文件,先做如下简单配置,具体相关模块及参数会在下面第二章进行描述;在这段配置参数中,我们需要明确的是:

1)在upstream模块中,‘function1’是服务名,可以自己定义,里面server后面的IP和端口需要与上面服务端暴露出来的一致;

2)下面server模块中的listen后跟的是暴露给客户端的端口号;

3)server_name是暴露给客户端的域名,可以自定义;

4)在location模块中,‘/function1’是客户端访问的路由地址,里面的proxy_pass后跟的是匹配客户端与服务端的参数,其中第一个function1指的是上面名为function1的upstream模块,替换里面的server参数,第二个function1是上面服务端的路由地址;

# nginx.conf user www-data; worker_processes auto; pid /run/nginx.pid; include /etc/nginx/modules-enabled/*.conf;  events { 	worker_connections 768; 	# multi_accept on; }  http {     upstream function1 {         server 192.168.20.10:8080;     }      server {         listen 8088;         server_name example.com;          location /function1 {             proxy_pass http://function1/function1;             proxy_set_header Host $host;             proxy_set_header X-Real-IP $remote_addr;             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;             proxy_set_header X-Forwarded-Proto $scheme;             proxy_set_header Content-Type $http_content_type;             proxy_set_header Content-Length $content_length;         }     } } 

1.2.3 创建客户端

       因为Nginx本身就是为高并发的请求做负载均衡的服务器,所以客户端这边直接使用一个名为Locust的压测工具作为Client端发起请求,具体Locust如何安装使用请看《Locust:压测工具Locust的安装及日常使用》这篇文章。

       这里我简单写一个locustfile.py的测试脚本,请求体为一个字典数据,包含一张图片的URL地址,打包成json格式采用post方式发送请求;在这段脚本中,我们需要明确的是:

1)代码中post请求的路由‘/function1’应与nginx.conf中的location模块一致;

2)代码中host的值填写的是nginx服务器的IP以及nginx.conf中listen对应值所暴露出来的端口号;

# locustfile.py import os from locust import HttpUser,TaskSet,task, constant import json  class WebsiteTasks(TaskSet):     @task(1)     def ask_function1(self):         data = {"url":"https://q9.itc.cn/q_70/images03/20240301/764d6020ea3e4d5c8dc50a44030c7c53.jpeg"}         res = self.client.post("/function1", json=data)           class WebsiteUser(HttpUser):     tasks = [WebsiteTasks]     host = "https://192.168.20.10:8088"  # 被测网站地址 

到此,前期的准备工作就基本上完成了,运行locustfile.py就可以实现简单的反向代理啦。

二、Nginx多种功能

2.1 同一服务多副本负载均衡

       这里指的多副本一般是部署在局域网内不同服务器上的相同服务,而对于同一服务器上的多个副本一般采用gunicorn等工具进行负载均衡;

则设:

1)服务端有两个副本,可以实现OCR功能,因为相同web服务,所以路由相同,IP及端口不同,分别为192.168.20.9:8081/ocr、192.168.20.8:8082/ocr;

2)Nginx的IP为192.168.20.7,暴露端口为8083,设置路由为‘/OCR’;

那么,nginx.conf就因该这样配置,在这种情况下,Nginx默认采用轮询机制做负载均衡:

# nginx.conf user www-data; worker_processes auto; pid /run/nginx.pid; include /etc/nginx/modules-enabled/*.conf;  events { 	worker_connections 768; 	# multi_accept on; }  http {     upstream ocr {         server 192.168.20.9:8081;         server 192.168.20.8:8082;     }      server {         listen 8083;         server_name example.com;          location /OCR {             proxy_pass http://ocr/ocr;             proxy_set_header Host $host;             proxy_set_header X-Real-IP $remote_addr;             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;             proxy_set_header X-Forwarded-Proto $scheme;             proxy_set_header Content-Type $http_content_type;             proxy_set_header Content-Length $content_length;         }     } } 

如果希望换其他的负载均衡方式,在upstream模块中实现:

# 轮询策略---默认 upstream ocr {     server 192.168.20.9:8081;     server 192.168.20.8:8082; }  # 加权轮询策略---根据权重值分配请求,权重高的服务器将会获得更多的请求 upstream ocr {     server 192.168.20.9:8081 weight=5;     server 192.168.20.8:8082 weight=3; }  # IP哈希---根据客户端 IP 地址进行哈希计算,使来自同一 IP 的请求始终转发到同一台服务器 upstream ocr {     ip_hash;     server 192.168.20.9:8081;     server 192.168.20.8:8082; }  # 最少连接策略---将新的请求发送到当前连接数最少的服务器 upstream ocr {     least_conn;     server 192.168.20.9:8081;     server 192.168.20.8:8082; }  # URL哈希---根据 URL 进行哈希计算,使相同 URL 的请求始终转发到同一台服务器 upstream ocr {     hash $request_uri consistent;     server 192.168.20.9:8081;     server 192.168.20.8:8082; }

2.2 备用服务端设置

       Nginx支持添加备用服务端,在运行的服务端挂掉时可以自动访问备用服务端,保证请求的正常返回,同样是在upstream模块中通过关键字‘backup’实现:

# 添加备用服务端 upstream ocr {     server 192.168.20.9:8081;     server 192.168.20.8:8082;     server 192.168.20.6:8084 backup; # 备用服务端 }

2.3 不同服务多副本负载均衡

       如果希望通过一个Nginx管理多个服务多个副本的负载均衡和反向代理,那该如何设置nginx.conf文件呢?

则设:

Service A - 三个副本,分别位于 IP 地址 192.168.1.10、192.168.1.11 和 192.168.1.12;

Service B - 两个副本,分别位于 IP 地址 192.168.1.20 和 192.168.1.21;

那么,nginx.conf就因该这样配置,为 Service A 和 Service B 分别定义 upstream 块,然后为每个服务定义 location 块,并将请求代理到对应的 upstream

http {     upstream service_a {         server 192.168.1.10;         server 192.168.1.11;         server 192.168.1.12;     }      upstream service_b {         server 192.168.1.20;         server 192.168.1.21;     }      server {         listen 8083;         server_name example.com;          # Service A         location /serviceA {             proxy_pass http://service_a;         }          # Service B         location /serviceB {             proxy_pass http://service_b;         }     } }

2.4 目前遇到的就这么多问题,如有新的问题将会持续更新~

相关内容

热门资讯

安卓系统可以分享视频吗,安卓系... 你有没有想过,手机里的视频怎么才能和朋友一起分享呢?尤其是当你发现了一个超级搞笑的短视频,或者是一部...
安卓系统上安装pc软件,跨平台... 你是不是也和我一样,对安卓系统上的那些PC软件垂涎欲滴呢?想象在手机上就能享受到电脑上的强大功能,是...
安卓原生系统怎么折腾,深度定制... 你有没有想过,你的安卓手机其实就像一个等待你发挥创意的画布呢?没错,就是那个安卓原生系统,它可是隐藏...
安卓作业系统耗电,深度解析耗电... 手机电量告急,是不是你也和我一样,对安卓作业系统的耗电问题头疼不已?别急,今天就来聊聊这个让人又爱又...
宝宝浙江游戏安卓系统,乐享童年 最近有没有发现你家的小宝贝对手机上的游戏越来越感兴趣了呢?尤其是那些在浙江地区特别受欢迎的安卓系统游...
安卓系统程序放在那,安卓系统程... 你有没有发现,手机里的安卓系统程序总是乱糟糟的,有时候找起来就像大海捞针一样?别急,今天就来给你揭秘...
手表怎么装上安卓系统,轻松安装... 你有没有想过,你的安卓手机那么智能,那你的手表呢?是不是也想给它来个升级,让它也能玩转各种应用,变身...
碧蓝航线在安卓系统,安卓平台上... 你知道吗?最近在安卓系统上,有一款游戏可是火得一塌糊涂,那就是《碧蓝航线》!这款游戏不仅画面精美,剧...
安卓系统设置分辨率,解锁屏幕显... 亲爱的手机控们,你是不是也和我一样,对手机屏幕的分辨率有着超乎寻常的执着呢?分辨率,这个看似简单的数...
安卓超市收银系统下载,高效便捷... 你有没有想过,逛超市的时候,收银员那熟练的操作是不是让你也跃跃欲试呢?现在,机会来了!安卓超市收银系...
安卓系统升级清理,深度清理与性... 亲爱的手机控们,你是不是也和我一样,对安卓系统的升级清理充满了好奇和期待呢?每次系统更新,都仿佛是给...
安卓如何绕过系统安装,深度解析... 你是不是也和我一样,对安卓系统的安装限制感到有些头疼?有时候,我们可能需要安装一些特殊的软件或者游戏...
安卓系统跟linux系统怎么样... 你有没有想过,你的手机里那个默默无闻的安卓系统,和电脑上那个稳如泰山的Linux系统,它们之间到底有...
凤凰系统用安卓软件很卡,凤凰系... 最近是不是发现你的凤凰系统用安卓软件时总是卡得要命?别急,让我来给你细细道来,看看这其中的原因和解决...
安卓系统怎么玩脸书,脸书应用攻... 你有没有想过,在安卓系统上怎么玩转脸书呢?这个全球最大的社交平台,可是让很多人沉迷其中哦!别急,今天...
虚拟机系统安卓11,虚拟机系统... 你有没有想过,手机里的安卓系统竟然也能变成电脑上的虚拟机?没错,就是那个我们每天不离手的安卓11系统...
钻石vip微信安卓系统,畅享无... 你知道吗?在微信这个庞大的社交世界里,钻石VIP可是个让人羡慕的身份呢!尤其是对于那些安卓系统的用户...
安装安卓系统后蓝屏,安卓系统安... 你刚刚升级了安卓系统,是不是觉得自己的手机焕然一新,充满了科技感?就在你沉浸在新系统的美好体验中时,...
安卓系统如何调出返回键,安卓系... 你是不是也和我一样,有时候在使用安卓手机时,突然发现那个神秘的返回键怎么就消失了?别急,今天就来手把...
荣耀8安装原生安卓系统,体验纯... 你有没有想过,让你的荣耀8手机焕发新生?别再让它被那些臃肿的第三方系统拖累啦!今天,就让我带你一起探...