Nginx反向代理和负载均衡
Nginx的作用
- 保护和隐藏原始资源服务器
- 负载均衡
最简单的反向代理演示(在一台服务器上做代理服务器,将http请求转发到另一台IIS服务器上,通过二级域名形式访问。)- 负载均衡旨在优化资源使用,最大化吞吐量,最小化响应时间。将用户请求分配给多个服务器。
- https通信nginx反向代理443端口
Nginx的使用
# 一般都是切换到 /usr/local/nginx/sbin 目录,执行以下操作
./nginx # 启动
./nginx -t # 测试 nginx.conf 配置文件是否出现语法错误
./nginx -s reload # 重启nginx服务
./nginx -s stop # 停止nginx服务
./nginx -s quit # 安全退出
ps aux|grep nginx # 查看nginx进程
反向代理
反向代理方式是指以代理服务器来接受 internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 internet 上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
简单来说就是真实的服务器不能直接被外部网络访问,所以需要一台代理服务器,而代理服务器能被外部网络访问的同时又跟真实服务器在同一个网络环境,当然也可能是同一台服务器,端口不同而已。
下面贴上一段简单的实现反向代理的代码:
server {
listen 80;
server_name localhost;
client_max_body_size 1024M;
# 代理前端访问地址
location /{
root html/dist;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
# 代码后端接口请求地址
location /api {
# 后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://10.30.29.19:16010/asset;
}
# 代理静态资源
location /static/ {
alias /data/static/;
autoindex on;
}
# 禁止访问某个目录
location ~* \.(txt|doc)${
root /data/www/test;
deny all;
}
# 防盗链
location ~* \.(gif|jpg|swf)$ {
valid_referers none blocked start.igrow.cn sta.igrow.cn;
if ($invalid_referer) {
rewrite ^/ http://$host/logo.png;
}
}
# 添加以下配置来开启缓存功能,指定缓存的存储路径
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
# 匹配需要缓存的静态文件
location ~ \.(gif|jpg|jpeg|png|bmp|swf|css|js)$ {
expires 30d; # 缓存时间设置为30天。
add_header Cache-Control "public";
# 指定缓存区域
proxy_cache my_cache;
proxy_cache_valid 200 304 30d; # 对200和304响应进行缓存,缓存时间为30天
proxy_cache_key $uri$is_args$args; # 缓存键值设置,根据URI和参数生成
proxy_cache_bypass $http_pragma; # 绕过缓存的指令,例如Pragma: no-cache
}
# 所有动态请求都转发给tomcat处理
location ~ \.(jsp|do)$ {
proxy_pass http://test;
}
}
保存配置文件后启动 Nginx,这样当我们访问 localhost 的时候,就相当于访问 localhost:8080 了。
挂载多个前端项目
一个端口号挂载多个前端项目,目的是为了尽量减少对外开放端口号的数量,一台服务器开放一个端口号即可。
前端代码打包配置
nginx配置
server {
listen 80;
server_name test;
# 前端1:此项目不用修改打包路径,直接用 ‘/’
location /{
root html/dist;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
location /api {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8081/asset;
}
# 前端2
location /iml{
alias html/web;
index index.html index.htm;
try_files $uri $uri/ /iml/index.html; # 此处注意添加iml前缀,否则刷新页面无法重定向正确
}
location /iml/api {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8082/asset;
}
#error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
反向代理443端口
server {
listen 80;
server_name localhost;
location / {
# 重定向到https
rewrite ^.*$ https://$server_name$1 redirect;
}
}
server {
listen 443 ssl;
server_name localhost;
ssl_certificate openssl/domain.crt;
ssl_certificate_key openssl/domain.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
root html/dist/;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
负载均衡
负载均衡也是 Nginx 常用的一个功能,负载均衡其意思就是分摊到多个操作单元上进行执行,例如 Web 服务器、FTP 服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
简单而言就是当有2台或以上服务器时,根据规则随机的将请求分发到指定的服务器上处理,负载均衡配置一般都需要同时配置反向代理,通过反向代理跳转到负载均衡。
使用upstream指令来定义后端服务器池,并使用proxy_pass指令将请求转发到这些服务器。如果你想要将请求分发到多个不同的地址,你可以在upstream块中指定多个服务器。
#负载均衡的核心代码为:
upstream backend {
server localhost:8081 weight=1;
server localhost:8082 weight=1;
server localhost:8083 weight=1;
}
server {
listen 80;
server_name localhost;
client_max_body_size 1024M;
location / {
proxy_pass http://backend;
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;
}
}
这里我配置了2台服务器,当然实际上是一台,只是端口不一样而已,而 8081 的服务器是不存在的,也就是说访问不到,但是我们访问 http://localhost 的时候,也不会有问题,会默认跳转到 http://localhost:8080 具体是因为Nginx会自动判断服务器的状态,如果服务器处于不能访问(服务器挂了),就不会跳转到这台服务器,所以也避免了一台服务器挂了影响使用的情况,由于Nginx默认是RR策略,所以我们不需要其他更多的设置。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步