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 的使用需要孰能生巧。

相关推荐
鲨莎分不晴5 分钟前
Nginx 部署前端项目实战指南
运维·前端·nginx
知南x7 分钟前
【STM32MP157 视频监控项目】(2) 移植 Nginx
stm32·nginx·音视频
问今域中9 分钟前
Spring Boot 请求参数绑定注解
java·spring boot·后端
计算机程序设计小李同学16 分钟前
婚纱摄影集成管理系统小程序
java·vue.js·spring boot·后端·微信小程序·小程序
一 乐1 小时前
绿色农产品销售|基于springboot + vue绿色农产品销售系统(源码+数据库+文档)
java·前端·数据库·vue.js·spring boot·后端·宠物
3***68841 小时前
Spring Boot中使用Server-Sent Events (SSE) 实现实时数据推送教程
java·spring boot·后端
C***u1761 小时前
Spring Boot问题总结
java·spring boot·后端
上进小菜猪1 小时前
基于 YOLOv8 的人体与行人检测智能识别实战 [目标检测完整源码]
后端
Elieal1 小时前
5 种方式快速创建 SpringBoot 项目
java·spring boot·后端
c***69301 小时前
Spring Boot实时推送技术详解:三个经典案例
spring boot·后端·状态模式