Nginx 应用的实践和思考

花间一壶酒,独酌无相亲。

1 前言

在当前开发的环境下,前后端分离的项目越来越广泛,在前后端项目部署时,会用到反向代理 Nginx。我们都知道 Nginx 是一个高性能、高可靠的 Web 服务器,而且可以支持热部署,对资源的消耗也比较少。在高并发的场景下性能十分优异。

nginx的应用场景十分的广泛:

scss 复制代码
1 静态资源服务,用于访问本地资源,主要是静态文件(图片、js、css) 等资源。
2 反向代理,可以进行负载均衡和应用缓存。
3 nginx 也可以做简单的限流,结合 openresty 、lua 可以扩展出更多的功能。

2 nginx 的安装

这里 nginx 的安装,指的是在 linux 服务器上,通常使用 yum install -y nginx && service nginx start 就能完成 nginx 的安装与启动,不过近段时间以来,宝塔部署的兴起,使得服务的运维以及安装更加简便,也可以通过界面化操作来安装和配置 nginx,十分的方便。

在 nginx 中,可以通过 nginx -h 命令查看常用的命令:

arduino 复制代码
nginx -s reload 重载配置文件,热部署
nginx -s reopen 重启 nginx
nginx -t 检查nginx 的配置,主要是检查语法
nginx -s stop 快速关闭 nginx 服务

nginx 安装完成之后,我们需要找到配置文件 /etc/nginx/nginx.conf,来进行项目的配置,项目的配置文件如下图所示:

在实际的开发过程中,一般包括多个 server , 然后配置不同的 location 进行转发和代理。

常见的 location 的配置如下所示:

css 复制代码
location [ = | ~ | ~* | ^~] uri {  
}

=  适用于精确匹配,如果匹配成功,不会继续向后查找,该配置不适用于正则查找。
~  该配置需要按照符号后面的正则表达式去匹配路径,区分大小写。
~* 改配置和~类似,不过不区分大小写,~ 和 ~* 的优先级都比较低,如果有多个 location 的正则都能匹配,则选取最长的配置。
^~ 适用于不含正则表达式的 uri, 如果匹配到改规则则使用,否则向后继续查找。

3 nginx 配置

前文中已经讲述了 nginx 的安装,在本节中将主要介绍常用的nginx 的项目配置。

3.1 静态文件配置

如下是常见的前端静态文件的转发配置,这里需要提一下 locationroot 或者 alias 的区别,但是需要强调一下 alias 后面必须要用 / 结束,否则找不到文件,而 root 则可有可无。

  • 1 root root目录 + 匹配的url + 后面的url
  • 2 alias alias目录 + 后面的url
bash 复制代码
    server {  
        listen       80;       # 配置监听的端口  
        server_name  example.com;    # 配置的域名  
        location / {  
            root   /usr/share/app/dist;  # 网站根目录  
            index  index.html index.htm;   # 默认首页文件  
            deny  ip;   # 禁止访问的ip地址,默认为 all 
            allow ip; # 允许访问的ip地址,默认为 all 
        }
        # 访问 test1,实际路径为 /usr/share/test1/test1
        localtion /test1 {
             root /usr/share/test1;
        }
        # 访问 test2,实际路径为 /usr/share/test2
        localtion /test2 {
             alias /usr/share/test2/;
        }
    }
3.2 负载均衡

通常情况下,后端的服务都是多台机器,都是需要配置负载均衡:

ini 复制代码
http {  
  upstream appserver {  
    ip_hash;  # 可以使用 fair 或者ip_hash 方式  
    server ip:8081;  # 负载均衡目的服务地址  
    server ip:8080;  
    server ip:8082 weight=10;  # weight 方式,不写默认为 1  
  }  
   
  server {  
    # location 配置
    location / {  
       proxy_pass http://appserver;  
       proxy_connect_timeout 10;  
    }  
  }  
}

这里需要提一下 proxy_pass 的用法,在 proxy_pass 后添加 / 会修改路径, 没有 / 则不会修改请求路径。这里需要介绍一下具体的使用方法:

javascript 复制代码
# 未使用 / 的情况
# 访问 http://www.test.com/testa/aaaa
# 后端的request_uri为: /testa/aaaa
location ^~ /testa/ {
    proxy_pass http://127.0.0.1:8801;
}

# 使用 / 的情况
# 访问 http://www.test.com/testb/bbbb
# 后端的request_uri为: /bbbb
location ^~ /testb/ {
    proxy_pass http://127.0.0.1:8801/;
}

以上是 proxy_pass 的通常用法,在实际情况中,可能需要对请求地址进行重写,这里就需要用到 request_urirewrite,结合两者就可以对访问url进行重写,以便灵活的实现转发功能。

bash 复制代码
# 使用 request_uri 的情况
# 访问 http://www.test.com/ccc/bbbb
# 后端的 request_uri 为: /aaa/ccc/bbbb
location /ccc/ {
    proxy_pass http://127.0.0.1:8801/aaa$request_uri;
}

# request_uri 、proxy_pass 和 rewrite 结合使用的场景,proxy_pass 没有 / 结尾
# 访问 http://www.test.com/namea/ddd
# 后端的 request_uri 为: /yongfu?namea=ddd
location /namea/ {
    rewrite    /namea/([^/]+) /yongfu?namea=$1 break;
    proxy_pass http://127.0.0.1:8801;
}

# request_uri 、proxy_pass 和 rewrite 结合使用的场景,proxy_pass 以 / 结尾
# 访问 http://www.test.com/nameb/eee
# 后端的request_uri为: /yongfu?nameb=eee
location /nameb/ {
    rewrite    /nameb/([^/]+) /yongfu?nameb=$1 break;
    proxy_pass http://127.0.0.1:8801/;
}

4 nginx 实践

在前文中已经介绍了 nginx 的配合信息,在本节中将使用 ruoyi 前后端的部署来进行实际操作。

ini 复制代码
server
{
    listen 80;
    server_name h5.example.com;
    index index.html index.htm default.htm default.html;
    
    # 项目静态文件配置地址 
    location / {
        root  /www/wwwroot/app/dist;
        try_files $uri $uri/ /index.html;
        index index.html index.htm; 
    }
    
    # 后台接口访问
    location /api/ {
        # 后端项目接口转发
        proxy_pass http://localhost:8283/;
        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 REMOTE-HOST $remote_addr;
        add_header X-Cache $upstream_cache_status;
        proxy_connect_timeout 30s;
        proxy_read_timeout 86400s;
        proxy_send_timeout 30s;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

5 总结

在本文中,介绍了 nginx 的安装和配置,使用了 ruoyi 项目前后端配置对 nginx 进行了实践。在实际的项目实践中, nginx 的应用场景十分广泛,需要根据具体的场景和需求进行编写对应的配置文件,这里是小编对 nginx 的一些使用实践和思考,对 nginx 的使用需要孰能生巧。

相关推荐
子玖1 小时前
go实现通过ip解析城市
后端·go
Java不加班1 小时前
Java 后端定时任务实现方案与工程化指南
后端
心在飞扬2 小时前
RAG 进阶检索学习笔记
后端
Moment2 小时前
想要长期陪伴你的助理?先从部署一个 OpenClaw 开始 😍😍😍
前端·后端·github
Das1_2 小时前
【Golang 数据结构】Slice 底层机制
后端·go
得物技术2 小时前
深入剖析Spark UI界面:参数与界面详解|得物技术
大数据·后端·spark
古时的风筝2 小时前
花10 分钟时间,把终端改造成“生产力武器”:Ghostty + Yazi + Lazygit 配置全流程
前端·后端·程序员
Cache技术分享2 小时前
340. Java Stream API - 理解并行流的额外开销
前端·后端
初次攀爬者2 小时前
RocketMQ 消息可靠性保障与堆积处理
后端·消息队列·rocketmq