从认识Nginx,到Nginx的使用
一、Nginx是什么?
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而闻名。
其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,处理高并发能力是十分强大的,能经受高负载的考验,有报告表明能支持高达 50,000 个并发连接数。除此,Nginx还支持热部署,启动简单,可以做到7*24不间断运行。几个月都不需要重新启动。
二、Nginx的反向代理(扩展:正向代理)
首先,看一张关于正向代理和反向代理的图片
在这里,我用通俗易懂的方式解释一下:
正向代理: 我们平时需要访问国外的浏览器是不是很慢,比如我们要看推特,看GitHub等等。我们直接用国内的服务器无法访问国外的服务器,或者是访问很慢。所以我们需要在本地搭建一个服务器来帮助我们去访问。那这种就是正向代理。(浏览器中配置代理服务器)
反向代理: 那什么是反向代理呢。比如:我们访问淘宝的时候,淘宝内部肯定不是只有一台服务器,它的内部有很多台服务器,那我们进行访问的时候,因为服务器中间session不共享,那我们是不是在服务器之间访问需要频繁登录,那这个时候淘宝搭建一个过渡服务器,对我们是没有任何影响的,我们是登录一次,但是访问所有,这种情况就是 反向代理。对我们来说,客户端对代理是无感知的,客户端不需要任何配置就可以访问,我们只需要把请求发送给反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器的地址。(在服务器中配置代理服务器)
三、Nginx的负载均衡
什么是负载均衡?
负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。
负载均衡其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。简单来说就是:现有的请求使服务器压力太大无法承受,所有我们需要搭建一个服务器集群,去分担原先一个服务器所承受的压力,那现在我们有ABCD等等多台服务器,我们需要把请求分给这些服务器,但是服务器可能大小也有自己的不同,所以怎么分?如何分配更好?又是一个问题。
Nginx给出来三种关于负载均衡的方式:
轮询法(默认方法):
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
适合服务器配置相当,无状态且短平快的服务使用。也适用于图片服务器集群和纯静态页面服务器集群。weight权重模式(加权轮询):
指定轮询比率,weight和访问比率成正比,用于后端服务器性能不均的情况。
这种方式比较灵活,当后端服务器性能存在差异的时候,通过配置权重,可以让服务器的性能得到充分发挥,有效利用资源。weight和访问比率成正比,用于后端服务器性能不均的情况。权重越高,在被访问的概率越大ip_hash:
上述方式存在一个问题就是说,在负载均衡系统中,假如用户在某台服务器上登录了,那么该用户第二次请求的时候,因为我们是负载均衡系统,每次请求都会重新定位到服务器集群中的某一个,那么已经登录某一个服务器的用户再重新定位到另一个服务器,其登录信息将会丢失,这样显然是不妥的。
我们可以采用ip_hash指令解决这个问题,如果客户已经访问了某个服务器,当用户再次访问时,会将该请求通过哈希算法,自动定位到该服务器。每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
四、Nginx的动静分离
Nginx的静态处理能力很强,但是动态处理能力不足,因此,在企业中常用动静分离技术。动静分离技术其实是采用代理的方式,在server{}段中加入带正则匹配的location来指定匹配项针对PHP的动静分离:静态页面交给Nginx处理,动态页面交给PHP-FPM模块或Apache处理。在Nginx的配置中,是通过location配置段配合正则匹配实现静态与动态页面的不同处理方式
目前,通过使用Nginx大大提高了网站的响应速度,优化了用户体验,让网站的健壮性更上一层楼!
传统解析方式
动静分离解析
五、Nginx的配置文件介绍
nginx的核心配置文件介绍(nginx.conf)
配置文件示例:
### 全局配置(Main模块) user nginx; # 指定运行worker进程的用户和组 worker_processes auto; # worker进程的个数,auto表示自动检测CPU核心数 error_log /var/log/nginx/error.log warn; # 错误日志存放路径及日志级别 pid /var/run/nginx.pid; # nginx的pid文件存放路径 worker_rlimit_nofile 65535; # 一个worker进程所能够打开的最大文件句柄数 ### 事件处理(Events模块) events { worker_connections 1024; # 每个worker进程支持的最大连接数 use epoll; # 使用epoll事件驱动模型,Linux推荐 multi_accept on; # 是否允许一次性地响应多个用户请求 } ### HTTP服务配置(Http模块) http { include /etc/nginx/mime.types; # 引入MIME类型文件 default_type application/octet-stream; # 默认MIME类型 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; # 定义日志格式 access_log /var/log/nginx/access.log main; # 访问日志存放路径及格式 sendfile on; # 是否使用sendfile传输文件 tcp_nopush on; # 启用TCP_NOPUSH或TCP_CORK选项 keepalive_timeout 65; # 长连接超时时间 # 虚拟主机配置 server { listen 80; # 监听端口 server_name localhost; # 服务名称 location / { root /usr/share/nginx/html; # 资源存放的根目录 index index.html index.htm; # 默认访问页面 } # 错误页面配置 error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } # 反向代理配置示例 location /app { proxy_pass http://127.0.0.1:8080; # 转发请求到后端服务器 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } # 负载均衡配置示例 upstream myapp1 { server backend1.example.com weight=5; server backend2.example.com; } server { listen 80; server_name myapp.example.com; location / { proxy_pass http://myapp1; # 使用上面定义的upstream } } } }
第一部分:全局块
作用:从配置文件开始到 events 块之间的内容,主要会设置一些影响nginx 服务器整体运行的配置指令,主要包括配 置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以 及配置文件的引入等。
比如上面第二、五行配置的worker_processes auto;
这是 Nginx 服务器并发处理服务的关键配置,worker_processes 值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约。因此,建议设置为等于CPU总核心数。
第二部分:events块
作用:events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否 允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等。
下图例子就表示每个 work process 支持的最大连接数为 1024。 这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。worker_connections 1024;
第三部分:http块
这算是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。
需要注意的是:http 块也可以包括 http 全局块、server 块。
①、http 全局块http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
②、server 块
这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。
全局 server 块
最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。
location 块
一个 server 块可以配置多个 location 块。
这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是 IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
Nginx核心参数配置的详细说明。
2.1、全局块
worker_processes
作用:设置工作进程的数量。
配置示例:
worker_processes auto;
或worker_processes 4;
说明:通常建议设置为机器的CPU核心数或核心数减1,也可以设置为
auto
让Nginx自动检测。
worker_rlimit_nofile
作用:设置每个worker进程可以打开的最大文件描述符数(文件句柄)。
配置示例:
worker_rlimit_nofile 65535;
说明:此值应足够大以支持预期的并发连接数。
2.2、Events块
worker_connections
作用:设置每个worker进程的最大并发连接数。
配置示例:
worker_connections 1024;
说明:Nginx服务器的最大连接数等于
worker_processes * worker_connections
。
use
作用:指定Nginx使用的事件驱动模型。
配置示例:
use epoll;
说明:Linux系统推荐使用epoll,它是完全的事件机制,可以实现多路IO复用。
multi_accept
作用:控制是否启用“接收新连接”的多路复用。
配置示例:
multi_accept on;
说明:当设置为
on
时,Nginx允许多个worker进程同时接受新连接,提高并发处理能力。
2.3、Http块
client_header_buffer_size
作用:设置客户端请求的请求行+请求头缓冲区大小。
配置示例:
client_header_buffer_size 4k;
说明:默认值是1k或4k,取决于操作系统。
large_client_header_buffers
作用:设置Nginx服务器接收和缓存客户端请求头的缓冲区的大小。
配置示例:
large_client_header_buffers 4 8k;
说明:用于处理大型或包含大量请求头的客户端请求。
client_header_timeout
作用:定义Nginx读取客户端请求头部的超时时间。
配置示例:
client_header_timeout 60s;
说明:如果客户端在这段时间内没有发送完请求头,则连接将被关闭。
keepalive_timeout
作用:设置长连接的超时时间。
配置示例:
keepalive_timeout 65;
说明:如果设置为0,则表示禁用长连接。
gzip
作用:开启或关闭gzip压缩功能。
配置示例:
gzip on;
说明:开启gzip可以减小传输数据量,提高网页加载速度。
proxy_pass
作用:将请求转发到后端服务器。
配置示例:
location / { proxy_pass http://backend; }
说明:常用于反向代理和负载均衡场景。
2.4、其他重要配置
server_name
作用:定义虚拟主机的名称。
配置示例:
server_name www.example.com;
说明:Nginx根据server_name来区分不同的虚拟主机。
listen
作用:指定Nginx监听的端口。
配置示例:
listen 80;
说明:Nginx默认监听80端口。
error_log
作用:设置错误日志文件的路径和级别。
配置示例:
error_log /var/log/nginx/error.log warn;
说明:日志级别有debug、info、notice、warn、error、crit、alert、emerg等。
access_log
作用:设置访问日志文件的路径和格式。
配置示例:
access_log /var/log/nginx/access.log main;
说明:通过访问
注意事项
配置文件结构:Nginx的配置文件(nginx.conf)通常包含全局块、events块、http块等,其中http块可以包含多个server块,每个server块又可以包含多个location块。
日志和错误处理:合理配置日志和错误处理对于监控和调试Nginx服务至关重要。
性能优化:通过调整worker_processes、worker_connections等参数,可以优化Nginx的性能。
安全性:合理配置SSL/TLS、限制请求速率、设置访问控制等,可以提高Nginx服务的安全性。
六、最简单的上线(初步尝试部署vue项目【已打包好的】)(本文章默认Nginx已安装,且是在Linux系统,windows都差不多)
以上,我们就知道了nginx整体大致的结构,以及每部分的结构是用于做什么的。接下来我们就修改nginx关键位置来实现我们网站的代理功能。看着nginx配置很繁琐,但是如果你只是需要上线一个网站,那么你只需要去修改两个地方即可:
我们可以使用默认简单的配置,然后指定server_name和root,主要是告诉nginx代理的ip是xxx,然后我放在服务器的文件在bbb文件夹即可。nginx便会在用户访问这个ip时,自动的将bbb文件夹中的index.html返回到浏览器来展示页面。
七、Nginx部分页面优化
前端history模式404问题:
location / { try_files $uri $uri/ /index.html; }
这段代码的作用是,当用户刷新页面时,Nginx会先检查当前URL是否存在,如果不存在,就会尝试访问index.html,从而可以正常显示页面。
反向代理:
相信大家作为前端都了解跨域问题,目前前端的主流解决跨域的方式就是
开发生产cors解决
开发proxy,生产nginx解决。
如何配置:
#接口端 location /police/ { proxy_pass http://192.168.1.182:8852/police/; proxy_redirect default; proxy_http_version 1.1; proxy_connect_timeout 60; proxy_send_timeout 60; proxy_read_timeout 90; }
具体位置:
理解:这段代码的意思:大致就是如果遇到以/police请求开头的接口,那么就去访问这个ip地址(http://192.168.1.182:8852/police/)的后台端口。
例如我们通过axios去访问/police/getList这个后台接口时,nginx会将这个请求转发到ip端口为http://192.168.1.182:8852的后台中,后台将结果返回给nginx,nginx再把结果给到浏览器,实现反向代理。
定义多个端口的反向代理:
copy上面的,直接修改代理头和proxy_pass即可。
开启gzip:
作用:
开启gzip对于前端来说还是比较重要的,浏览器加载的包大概能节约一半的空间。例如首页需要加载a.js文件,该文件为900kb,在开启gzip之后,浏览器会去加载a.js经过gzip之后的文件a.js.gz,大概只有450kb,能够很好的提升浏览速度。
如何配置:
gzip on; # 默认off,是否开启gzip gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; # 上面两个开启基本就能跑起了,下面的愿意折腾就了解一下 gzip_static on; gzip_proxied any; gzip_vary on; gzip_comp_level 6; gzip_buffers 16 8k; # gzip_min_length 1k; gzip_http_version 1.1;
具体位置:
维护页面:
作用:在系统进行维护升级时,用户打开我们的网站看到的维护页面。
如何配置:
# 系统临时维护请打开下面这行注释,并重启nginx,维护完毕后请注释下年这行,并重启nginx # rewrite ^(.*)$ /maintainace.html break;
具体位置:
一个ip上线多个网站:
作用:
只有一个ip。利用nginx上线多个网站。例如访问192.168.1.154:8080访问我们的个人博客网站,访问192.168.1.154:8081访问我们的直播网站。
如何配置:
直接复制server块即可,一个server块就代表了一个网站,需要改端口和文件的路径等内容。
# 第一个网站:个人博客项目配置 server { listen 8080; root /data/www/hexo; index index.html; location / { try_files $uri $uri/ /index.html; # 路由模式history的修改 } } # 第二个网站:直播网站项目配置 server { listen 8081; root /data/www/geov; index index.html; location / {} }
具体位置:
注意点:这里的8081一定要你的服务器开放了这个端口才可以使用,否则你按照这个配置了也会访问不到(让后端去配)。
如果是云服务器(比如阿里云,腾讯云),则需要开放相应的入口为8081,否则用户访问不到。
动静分离
作用:
在Web开发中,通常来说,动态资源其实就是指那些后台资源,而静态资源就是指HTML,JavaScript,CSS,img等文件。
一般来说,都需要将动态资源和静态资源分开,将静态资源部署在Nginx上,当一个请求来的时候,如果是静态资源的请求,就直接到nginx配置的静态资源目录下面获取资源,如果是动态资源的请求,nginx利用反向代理的原理,把请求转发给后台应用去处理,从而实现动静分离。
在使用前后端分离之后,可以很大程度的提升静态资源的访问速度,同时在开过程中也可以让前后端开发并行可以有效的提高开发时间,也可以有些的减少联调时间 。
解析:
实际上我们在代理前端的html和接口时就已经做到了动静分离。我们打包后的dist包实际上就是纯静态的资源,所以直接访问nginx静态资源服务器,就不需要经过后台的tomcat。访问接口时,就需要nginx先去访问后台服务器,拿到结果再给到浏览器
图解:
如何配置(其实是优化,因为一般配置会有动静分离):假设有比较大的图片等需要放置到服务器上,然后通过nginx来转发。或者是有一个纯前端的开源项目(如pdf.js),也需要放在服务器上。如果放在本地代码包,打包出来体积会很大。
location /image/ { root /var/filecenter/; } location /static/ { root /var/filecenter/; } location /car/ { root /var/filecenter/; } location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|js|css)$ { root /Users/dalaoyang/Downloads/static; }
具体位置:
这里只讲了一些nginx基础的知识和一些基础的优化,基本上够用了。但是如果你需要追求更高的性能,那么可以添加其他的优化。nginx主要还是配置多一些,但是理解了整体结构和脉络的话,其实就还是蛮简单的。这里就不做过多的讲解了。
八、Nginx基础命令:安装、启动、重启、关闭
安装nginx:
yum install nginx
看是否有nginx进程:
netstat -anput | grep nginx
查看服务器端口占用情况:
netstat -ntlp
nginx启动:
nginx
nginx重启:
nginx -s reload
关闭nginx:
nginx -s stop
: 快速停止nginxnginx -s quit
:完整有序的停止nginx
查看默认的nginx配置文件路径:
nginx -t
注:如果有nginx.conf配置的更改,需要重启nginx配置才会生效。如果只是更改dist包/html,则可以不重启nginx。
九、Nginx的性能优化
1. 调整工作进程数
Nginx的worker_processes指令控制工作进程的数量,通常设置为CPU核心数。这样可以充分利用服务器的多核处理能力。
worker_processes auto;
2. 优化工作进程设置
通过调整worker_connections指令,可以增加每个工作进程可以处理的最大连接数。这有助于提高并发处理能力。
events { worker_connections 1024; }
3. 启用Gzip压缩
启用Gzip压缩可以减少传输数据的大小,从而提高页面加载速度。
http { gzip on; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; gzip_proxied any; gzip_comp_level 6; }
4. 配置缓存
配置缓存可以减少后端服务器的负担并提高响应速度。使用proxy_cache和相关指令进行缓存设置。
http { proxy_cache_path /tmp/cache levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off; server { location / { proxy_pass http://backend_server; proxy_cache my_cache; proxy_cache_valid 200 1m; proxy_cache_valid 404 1m; } } }
5. 使用负载均衡
负载均衡可以分散请求到多个后端服务器,从而提高应用的可用性和性能。
http { upstream backend { server backend1.example.com; server backend2.example.com; } server { location / { proxy_pass http://backend; } } }
6. 调整连接超时设置
通过合理设置连接超时,可以释放未使用的资源,保持服务器高效运行。
http { keepalive_timeout 65; client_header_timeout 10s; client_body_timeout 10s; send_timeout 10s; }
7. 禁用不必要的模块
禁用不必要的模块可以减少内存使用并提高性能。可以在编译Nginx时选择性地启用所需的模块。
./configure --without-http_autoindex_module --without-http_auth_basic_module
8. 优化文件描述符限制
增加文件描述符限制可以提高Nginx的并发处理能力。在/etc/security/limits.conf文件中设置:
* soft nofile 65536 * hard nofile 65536
通过以上优化步骤,你可以显著提高Nginx的性能。这些调整不仅能提高处理能力,还能改善用户体验。务必根据实际负载和需求测试和调整配置,以达到最佳效果。
十、项目部署(加ssl证书)【ps:以下的配置基于SmartAdmin框架】
http与https的差异与作用这里不加赘述,请自行学习!
user www www; worker_processes auto; error_log /www/wwwlogs/nginx_error.log crit; pid /www/server/nginx/logs/nginx.pid; worker_rlimit_nofile 51200; stream { log_format tcp_format '$time_local|$remote_addr|$protocol|$status|$bytes_sent|$bytes_received|$session_time|$upstream_addr|$upstream_bytes_sent|$upstream_bytes_received|$upstream_connect_time'; access_log /www/wwwlogs/tcp-access.log tcp_format; error_log /www/wwwlogs/tcp-error.log; include /www/server/panel/vhost/nginx/tcp/*.conf; } events { use epoll; worker_connections 32000; multi_accept on; } http { include mime.types; #include luawaf.conf; include proxy.conf; lua_package_path "/www/server/nginx/lib/lua/?.lua;;"; default_type application/octet-stream; server_names_hash_bucket_size 512; client_header_buffer_size 32k; large_client_header_buffers 4 32k; client_max_body_size 50m; sendfile on; tcp_nopush on; # 通过合理设置连接超时,可以释放未使用的资源,保持服务器高效运行。 keepalive_timeout 60; client_header_timeout 10s; client_body_timeout 10s; send_timeout 10s; tcp_nodelay on; fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 256k; fastcgi_intercept_errors on; gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.1; gzip_comp_level 5; gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/json image/jpeg image/gif image/png font/ttf font/otf image/svg+xml application/xml+rss text/x-js; gzip_vary on; gzip_proxied expired no-cache no-store private auth; gzip_disable "MSIE [1-6]\."; limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn_zone $server_name zone=perserver:10m; # 配置缓存可以减少后端服务器的负担并提高响应速度。使用proxy_cache和相关指令进行缓存设置。 proxy_cache_path /tmp/cache levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off; server_tokens off; access_log off; server { listen 80; server_name pionnermes.zscbdic.cn; # 将请求转成https rewrite ^/(.*) https://$server_name$request_uri? permanent; location / { root /www/wwwroot/pionnermes.zscbdic.cn/; try_files $uri $uri/ /index.html last; index index.html index.htm; expires -1; # 防盗链 valid_referers none blocked server_names *.pionnermes.zscbdic.cn; if ($invalid_referer) { return 403; } } # 系统临时维护请打开下面这行注释,并重启nginx,维护完毕后请注释下年这行,并重启nginx # rewrite ^(.*)$ /maintainace.html break; # 缓存文件,提高性能 location ~* \.(jpg|jpeg|png|gif)$ { expires 30d; } location ~* \.(css|js)$ { expires 600; add_header Cache-control max-age=800; } } server { listen 443 ssl; server_name pionnermes.zscbdic.cn; # 访问静态资源服务器 root /www/wwwroot/pionnermes.zscbdic.cn/; index index.html index.htm index.php; # 证书配置 ssl_certificate /www/wwwroot/ssh/pionnermes.zscbdic.cn_bundle.pem; ssl_certificate_key /www/wwwroot/ssh/pionnermes.zscbdic.cn.key; # ssl验证相关配置 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; # 配置 gzip 压缩 gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_comp_level 5; gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png; gzip_vary on; gzip_disable "MSIE [1-6]\."; # 禁用 OPTIONS 请求 if ($request_method ~* OPTIONS) { return 403; } # 前端配置 location / { root /www/wwwroot/pionnermes.zscbdic.cn/; try_files $uri $uri/ /index.html last; index index.html index.htm; expires -1; } # 系统临时维护请打开下面这行注释,并重启nginx,维护完毕后请注释下年这行,并重启nginx # rewrite ^(.*)$ /maintainace.html break; # 缓存文件,提高性能 location ~* \.(jpg|jpeg|png|gif)$ { expires 30d; } location ~* \.(css|js)$ { expires 600; add_header Cache-control max-age=800; } # 通过配置网站服务器进行输出压缩,可以减少http响应传输的数据量,从而提高网站页面的加载速度。 location ~ .*\.(jpg|gif|png|js)$ { gzip on; gzip_http_version 1.1; gzip_comp_level 5; # 压缩级别,默认1,最高9 gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif img/png; } # 后端配置 location /pioneer-mes { #反向代理的java地址 proxy_pass http://pionnermes.zscbdic.cn:8080/pioneer-mes; # 假设你的后端服务运行在本地的8080端口 # 传递客户端IP和协议 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; set $my_proxy_add_x_forwarded_for $proxy_add_x_forwarded_for; if ($proxy_add_x_forwarded_for ~* "127.0.0.1"){ set $my_proxy_add_x_forwarded_for $remote_addr; } proxy_set_header X-Forwarded-For $my_proxy_add_x_forwarded_for; #此处是https访问的关键环节 proxy_redirect off; #设置没有缓存[此处很重要,必须设置,不然有些浏览器对get请求会缓存,引发不必要的bug] expires -1; #一些安全配置 add_header Set-Cookie "Path=/; HttpOnly; Secure"; add_header X-Content-Type-Options "nosniff"; add_header X-XSS-Protection "1; mode=block"; #设置跨域方法 # add_header Access-Control-Allow-Origin *; add_header X-Frame-Options "ALLOW-FROM pionnermes.zscbdic.cn"; add_header Content-Security-Policy "frame-ancestors pionnermes.zscbdic.cn"; } # 后端api swagger和knife4j配置 location /v3/api-docs/ { proxy_pass http://pionnermes.zscbdic.cn:8080/pioneer-mes/v3/api-docs/; proxy_redirect off; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $http_host; #一些安全配置 add_header Set-Cookie "Path=/; HttpOnly; Secure"; add_header X-Content-Type-Options "nosniff"; add_header X-XSS-Protection "1; mode=block"; add_header X-Frame-Options "ALLOW-FROM pionnermes.zscbdic.cn"; add_header Content-Security-Policy "frame-ancestors pionnermes.zscbdic.cn"; expires -1; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } include /www/server/panel/vhost/nginx/*.conf; }
扩展:Nginx 中 proxy_pass 末尾斜杠的奥秘
一、proxy_pass 的类型概述
Nginx 的官网将 proxy_pass 分为两种类型:不带 URI 方式和带 URI 方式。
不带 URI 方式只包含 IP 和端口号,例如 proxy_pass http://localhost:8080。而带 URI 方式在端口号之后有其他路径,包括只有单个 “/” 的,如 proxy_pass http://localhost:8080/,以及其他路径,比如 proxy_pass http://localhost:8080/xxx。
这两种类型的处理方式有很大不同,理解它们的区别对于正确配置 Nginx 反向代理至关重要。
1、 在不带 URI 方式下,nginx 将会保留 location 中路径部分,当访问 http://localhost/api1/xxx 时,若配置为
location /api1/ { proxy_pass http://localhost:8080; }
会代理到 http://localhost:8080/api1/xxx
2、 在带 URI 方式下,nginx 将使用诸如 alias 的替换方式对 URL 进行替换,例如当访问 http://localhost/api2/xxx 时,若配置为
location /api2/ { proxy_pass http://localhost:8080/; }
http://localhost/api2/(注意最后的 “/”)被替换成了 http://localhost:8080/,然后再加上剩下的 “xxx”,于是变成了 http://localhost:8080/xxx。了解这两种类型的特点,能帮助我们在实际应用中更加准确地配置 Nginx,确保反向代理的正确运行。
二、不带 URI 方式详解
(一)举例与原理
为了更好地理解不带 URI 方式的工作原理,我们来看更多的例子。假如客户端请求为:http://localhost/test3/xxx,配置为
location /test3/ { proxy_pass http://localhost:8080; }
按照不带 URI 方式的规则,首先保留 location 后的所有内容,即 http://localhost/test3/xxx。然后拼接代理路径后面,最终请求为 http://localhost:8080/test3/xxx。
再看一个例子,客户端请求为:http://localhost/test4/xxx,配置为
location /test4/ { proxy_pass http://localhost:8080; }
同样,先保留 location 后的所有内容,得到 http://localhost/test4/xxx。接着拼接代理路径,最终请求变为 http://localhost:8080/test4/xxx。
通过这些例子可以看出,在不带 URI 方式下,无论 location 中的路径具体形式如何,Nginx 都会严格按照 “保留 location 后的内容,拼接代理路径后” 的规则进行处理。
(二)总结特点
不带 URI 方式确实较为简单直接。在实际应用中,我们无需过多考虑复杂的路径替换规则,只要记住无论 location 中带不带右斜杠,都将其后面的内容直接拼接到代理路径后即可。这种方式在一些场景下可以快速实现反向代理的配置,提高配置效率。同时,由于其规则简单,也减少了出现配置错误的可能性。例如,在一些小型项目或者对反向代理要求不高的场景中,不带 URI 方式可以满足基本的代理需求,并且易于理解和维护。总之,不带 URI 方式以其简洁性和稳定性在 Nginx 的反向代理配置中有着特定的应用场景和价值。
三、带 URI 方式剖析
(一)举例与规则
假如客户端请求为:http://localhost/test7/xxx,配置为
location /test7/ { proxy_pass http://localhost:8080/aaa/bbb/; }
按照带 URI 方式的规则,首先在客户端请求去除 location,获得剩下的右侧内容,即 xxx(获得的右侧内容)。然后拼接到代理路径中,最终请求为 http://localhost:8080/aaa/bbb/xxx。
再如,客户端请求为:http://localhost/test8/xxx,配置为
location /test8 { proxy_pass http://localhost:8080/ccc; }
同样先去除 location,获得右侧内容 /xxx(获得的右侧内容)。接着拼接到代理路径中,最终请求为 http://localhost:8080/ccc/xxx。
通过这些例子可以清晰地看到,在带 URI 方式下,无论代理路径的具体形式如何,总是先去除 location,然后将剩余的右侧内容拼接到代理路径中。这种方式相对不带 URI 方式更加复杂,需要仔细考虑代理路径的具体配置,以确保最终的请求路径正确。
(二)总结建议
如前文所述,当 location 和 proxy_pass 中有一个不带斜杠时,最终的请求路径就可能出现不同寻常的情况。例如,客户端请求为 http://localhost/test9/xxx 时
location /test9 { proxy_pass http://localhost:8080/ddd/; }
最终请求为 http://localhost:8080/ddd//xxx 这里会出现路径拼接错误的情况。
因此,为了避免出现这种错误,建议在配置 Nginx 反向代理时,要不 location 和 proxy_pass 都带斜杠,要不都不带。这样可以确保路径拼接的正确性,减少配置错误的可能性。在实际应用中,我们应该根据具体的需求和场景,谨慎选择带 URI 方式或不带 URI 方式,并严格遵循这个建议,以确保 Nginx 反向代理的稳定运行。