从认识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 块之间的内容,主要会设置一些影响nginx 服务器整体运行的配置指令,主要包括配 置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以 及配置文件的引入等。
第二部分:events块
- **作用:events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否 允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等。
**下图例子就表示每个 work process 支持的最大连接数为 1024。 这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。
worker_connections 1024;
- **作用:events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否 允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等。
第三部分: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)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
2、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解决。
如何配置:
#接口端 |
具体位置:
理解:
这段代码的意思:大致就是如果遇到以/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先去访问后台服务器,拿到结果再给到浏览器
**图解:**
-qyce.png)
**如何配置(其实是优化,因为一般配置会有动静分离):**
假设有比较大的图片等需要放置到服务器上,然后通过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 反向代理的稳定运行。