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

相关推荐
2401_857622666 小时前
SpringBoot框架下校园资料库的构建与优化
spring boot·后端·php
2402_857589366 小时前
“衣依”服装销售平台:Spring Boot框架的设计与实现
java·spring boot·后端
哎呦没7 小时前
大学生就业招聘:Spring Boot系统的架构分析
java·spring boot·后端
_.Switch7 小时前
Python Web 应用中的 API 网关集成与优化
开发语言·前端·后端·python·架构·log4j
杨哥带你写代码9 小时前
足球青训俱乐部管理:Spring Boot技术驱动
java·spring boot·后端
AskHarries9 小时前
读《show your work》的一点感悟
后端
A尘埃9 小时前
SpringBoot的数据访问
java·spring boot·后端
yang-23079 小时前
端口冲突的解决方案以及SpringBoot自动检测可用端口demo
java·spring boot·后端
Marst Code9 小时前
(Django)初步使用
后端·python·django
代码之光_19809 小时前
SpringBoot校园资料分享平台:设计与实现
java·spring boot·后端