花间一壶酒,独酌无相亲。
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 静态文件配置
如下是常见的前端静态文件的转发配置,这里需要提一下 location
中 root
或者 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_uri
和 rewrite
,结合两者就可以对访问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 的使用需要孰能生巧。