一、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的反向代理(扩展:正向代理)

首先,看一张关于正向代理和反向代理的图片

img

在这里,我用通俗易懂的方式解释一下:

正向代理: 我们平时需要访问国外的浏览器是不是很慢,比如我们要看推特,看GitHub等等。我们直接用国内的服务器无法访问国外的服务器,或者是访问很慢。所以我们需要在本地搭建一个服务器来帮助我们去访问。那这种就是正向代理。(浏览器中配置代理服务器

反向代理: 那什么是反向代理呢。比如:我们访问淘宝的时候,淘宝内部肯定不是只有一台服务器,它的内部有很多台服务器,那我们进行访问的时候,因为服务器中间session不共享,那我们是不是在服务器之间访问需要频繁登录,那这个时候淘宝搭建一个过渡服务器,对我们是没有任何影响的,我们是登录一次,但是访问所有,这种情况就是 反向代理。对我们来说,客户端对代理是无感知的,客户端不需要任何配置就可以访问,我们只需要把请求发送给反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器的地址。(在服务器中配置代理服务器

三、Nginx的负载均衡

  1. 什么是负载均衡?

    1. 负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。
      负载均衡其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

    2. 简单来说就是:现有的请求使服务器压力太大无法承受,所有我们需要搭建一个服务器集群,去分担原先一个服务器所承受的压力,那现在我们有ABCD等等多台服务器,我们需要把请求分给这些服务器,但是服务器可能大小也有自己的不同,所以怎么分?如何分配更好?又是一个问题。

  2. Nginx给出来三种关于负载均衡的方式:

    1. 轮询法(默认方法):
      每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
      适合服务器配置相当,无状态且短平快的服务使用。也适用于图片服务器集群和纯静态页面服务器集群。
    2. weight权重模式(加权轮询):
      指定轮询比率,weight和访问比率成正比,用于后端服务器性能不均的情况。
      这种方式比较灵活,当后端服务器性能存在差异的时候,通过配置权重,可以让服务器的性能得到充分发挥,有效利用资源。weight和访问比率成正比,用于后端服务器性能不均的情况。权重越高,在被访问的概率越大
    3. ip_hash:
      上述方式存在一个问题就是说,在负载均衡系统中,假如用户在某台服务器上登录了,那么该用户第二次请求的时候,因为我们是负载均衡系统,每次请求都会重新定位到服务器集群中的某一个,那么已经登录某一个服务器的用户再重新定位到另一个服务器,其登录信息将会丢失,这样显然是不妥的。
      我们可以采用ip_hash指令解决这个问题,如果客户已经访问了某个服务器,当用户再次访问时,会将该请求通过哈希算法,自动定位到该服务器。每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

四、Nginx的动静分离

Nginx的静态处理能力很强,但是动态处理能力不足,因此,在企业中常用动静分离技术。动静分离技术其实是采用代理的方式,在**server{}**段中加入带正则匹配的location来指定匹配项针对PHP的动静分离:静态页面交给Nginx处理,动态页面交给PHP-FPM模块或Apache处理。在Nginx的配置中,是通过location配置段配合正则匹配实现静态与动态页面的不同处理方式
目前,通过使用Nginx大大提高了网站的响应速度,优化了用户体验,让网站的健壮性更上一层楼!

传统解析方式

img

动静分离解析

img

五、Nginx的配置文件介绍

  1. nginx的核心配置文件介绍(nginx.conf)

    1. 配置文件示例:

      全局配置(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
      ​ }
      ​ }
      ​ }
      }

    2. 第一部分:全局块

      1. 作用:从配置文件开始到 events 块之间的内容,主要会设置一些影响nginx 服务器整体运行的配置指令,主要包括配 置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以 及配置文件的引入等。
        比如上面第二、五行配置的

        1
        worker_processes  auto;

        这是 Nginx 服务器并发处理服务的关键配置,worker_processes 值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约。因此,*建议设置为等于CPU总核心数。*

    3. 第二部分:events块

      1. **作用:events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否 允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等。
        **下图例子就表示每个 work process 支持的最大连接数为 1024。 这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。

        1
        worker_connections  1024;
    4. 第三部分:http块

      1. 这算是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。

        需要注意的是:http 块也可以包括 http 全局块、server 块。
        ①、http 全局块

        ​ http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。

        ②、server 块

        ​ 这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。==每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。==

        1. 全局 server 块

          ​ 最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。

        2. location 块

          ​ 一个 server 块可以配置多个 location 块。

          ​ 这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是 IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。img

  2. Nginx核心参数配置的详细说明。

    2.1、全局块

    1. worker_processes
      • 作用:设置工作进程的数量。
      • 配置示例worker_processes auto;worker_processes 4;
      • 说明:通常建议设置为机器的CPU核心数或核心数减1,也可以设置为auto让Nginx自动检测。
    2. worker_rlimit_nofile
      • 作用:设置每个worker进程可以打开的最大文件描述符数(文件句柄)。
      • 配置示例worker_rlimit_nofile 65535;
      • 说明:此值应足够大以支持预期的并发连接数。

    2.2、Events块

    1. worker_connections
      • 作用:设置每个worker进程的最大并发连接数。
      • 配置示例worker_connections 1024;
      • 说明:Nginx服务器的最大连接数等于worker_processes * worker_connections
    2. use
      • 作用:指定Nginx使用的事件驱动模型。
      • 配置示例use epoll;
      • 说明:Linux系统推荐使用epoll,它是完全的事件机制,可以实现多路IO复用。
    3. multi_accept
      • 作用:控制是否启用“接收新连接”的多路复用。
      • 配置示例multi_accept on;
      • 说明:当设置为on时,Nginx允许多个worker进程同时接受新连接,提高并发处理能力。

    2.3、Http块

    1. client_header_buffer_size
      • 作用:设置客户端请求的请求行+请求头缓冲区大小。
      • 配置示例client_header_buffer_size 4k;
      • 说明:默认值是1k或4k,取决于操作系统。
    2. large_client_header_buffers
      • 作用:设置Nginx服务器接收和缓存客户端请求头的缓冲区的大小。
      • 配置示例large_client_header_buffers 4 8k;
      • 说明:用于处理大型或包含大量请求头的客户端请求。
    3. client_header_timeout
      • 作用:定义Nginx读取客户端请求头部的超时时间。
      • 配置示例client_header_timeout 60s;
      • 说明:如果客户端在这段时间内没有发送完请求头,则连接将被关闭。
    4. keepalive_timeout
      • 作用:设置长连接的超时时间。
      • 配置示例keepalive_timeout 65;
      • 说明:如果设置为0,则表示禁用长连接。
    5. gzip
      • 作用:开启或关闭gzip压缩功能。
      • 配置示例gzip on;
      • 说明:开启gzip可以减小传输数据量,提高网页加载速度。
    6. proxy_pass
      • 作用:将请求转发到后端服务器。
      • 配置示例location / { proxy_pass http://backend; }
      • 说明:常用于反向代理和负载均衡场景。

    2.4、其他重要配置

    1. server_name
      • 作用:定义虚拟主机的名称。
      • 配置示例server_name www.example.com;
      • 说明:Nginx根据server_name来区分不同的虚拟主机。
    2. listen
      • 作用:指定Nginx监听的端口。
      • 配置示例listen 80;
      • 说明:Nginx默认监听80端口。
    3. error_log
      • 作用:设置错误日志文件的路径和级别。
      • 配置示例error_log /var/log/nginx/error.log warn;
      • 说明:日志级别有debug、info、notice、warn、error、crit、alert、emerg等。
    4. access_log
      • 作用:设置访问日志文件的路径和格式。
      • 配置示例access_log /var/log/nginx/access.log main;
      • 说明:通过访问

    注意事项

    1. 配置文件结构:Nginx的配置文件(nginx.conf)通常包含全局块、events块、http块等,其中http块可以包含多个server块,每个server块又可以包含多个location块。
    2. 日志和错误处理:合理配置日志和错误处理对于监控和调试Nginx服务至关重要。
    3. 性能优化:通过调整worker_processes、worker_connections等参数,可以优化Nginx的性能。
    4. 安全性:合理配置SSL/TLS、限制请求速率、设置访问控制等,可以提高Nginx服务的安全性。

六、最简单的上线(初步尝试部署vue项目【已打包好的】)(本文章默认Nginx已安装,且是在Linux系统,windows都差不多)

以上,我们就知道了nginx整体大致的结构,以及每部分的结构是用于做什么的。接下来我们就修改nginx关键位置来实现我们网站的代理功能。看着nginx配置很繁琐,但是如果你只是需要上线一个网站,那么你只需要去修改两个地方即可:

img

我们可以使用默认简单的配置,然后指定==server_nameroot==,主要是告诉nginx代理的ip是xxx,然后我放在服务器的文件在bbb文件夹即可。nginx便会在用户访问这个ip时,自动的将bbb文件夹中的index.html返回到浏览器来展示页面。

七、Nginx部分页面优化

  1. 前端history模式404问题:

    1
    2
    3
    location / {
    try_files $uri $uri/ /index.html;
    }

    这段代码的作用是,当用户刷新页面时,Nginx会先检查当前URL是否存在,如果不存在,就会尝试访问index.html,从而可以正常显示页面。

  2. 反向代理:

    相信大家作为前端都了解跨域问题,目前前端的主流解决跨域的方式就是

    1. 开发生产cors解决
    2. 开发proxy,生产nginx解决。

    如何配置:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 接口端
    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;
    }

    具体位置:
    img
    理解:

    这段代码的意思:大致就是如果遇到以/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即可。
    img

  3. 开启gzip:

    作用:

    开启gzip对于前端来说还是比较重要的,浏览器加载的包大概能节约一半的空间。例如首页需要加载a.js文件,该文件为900kb,在开启gzip之后,浏览器会去加载a.js经过gzip之后的文件a.js.gz,大概只有450kb,能够很好的提升浏览速度。

    如何配置:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    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;

    具体位置:
    img

  4. 维护页面:
    作用:

    在系统进行维护升级时,用户打开我们的网站看到的维护页面。

    如何配置:

    1
    2
    # 系统临时维护请打开下面这行注释,并重启nginx,维护完毕后请注释下年这行,并重启nginx
    # rewrite ^(.*)$ /maintainace.html break;

    具体位置:
    img

  5. 一个ip上线多个网站:

    作用:

    只有一个ip。利用nginx上线多个网站。例如访问192.168.1.154:8080访问我们的个人博客网站,访问192.168.1.154:8081访问我们的直播网站。

    如何配置:

    直接复制server块即可,一个server块就代表了一个网站,需要改端口和文件的路径等内容。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    # 第一个网站:个人博客项目配置
    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 / {}
    }

    具体位置:
    img
    注意点:

    1. 这里的8081一定要你的服务器开放了这个端口才可以使用,否则你按照这个配置了也会访问不到(让后端去配)。
    2. 如果是云服务器(比如阿里云,腾讯云),则需要开放相应的入口为8081,否则用户访问不到。
  6. 动静分离

    作用:

    在Web开发中,通常来说,动态资源其实就是指那些后台资源,而静态资源就是指HTML,JavaScript,CSS,img等文件。

    一般来说,都需要将动态资源和静态资源分开,将静态资源部署在Nginx上,当一个请求来的时候,如果是静态资源的请求,就直接到nginx配置的静态资源目录下面获取资源,如果是动态资源的请求,nginx利用反向代理的原理,把请求转发给后台应用去处理,从而实现动静分离。

    在使用前后端分离之后,可以很大程度的提升静态资源的访问速度,同时在开过程中也可以让前后端开发并行可以有效的提高开发时间,也可以有些的减少联调时间 。

    解析:

    实际上我们在代理前端的html和接口时就已经做到了动静分离。我们打包后的dist包实际上就是纯静态的资源,所以直接访问nginx静态资源服务器,就不需要经过后台的tomcat。访问接口时,就需要nginx先去访问后台服务器,拿到结果再给到浏览器
    img
    图解:
    img
    如何配置(其实是优化,因为一般配置会有动静分离):

    假设有比较大的图片等需要放置到服务器上,然后通过nginx来转发。或者是有一个纯前端的开源项目(如pdf.js),也需要放在服务器上。如果放在本地代码包,打包出来体积会很大。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    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;
    }

    具体位置:
    img

这里只讲了一些nginx基础的知识和一些基础的优化,基本上够用了。但是如果你需要追求更高的性能,那么可以添加其他的优化。nginx主要还是配置多一些,但是理解了整体结构和脉络的话,其实就还是蛮简单的。这里就不做过多的讲解了。

八、Nginx基础命令:安装、启动、重启、关闭

安装nginx:

1
yum install nginx

看是否有nginx进程:

1
netstat -anput | grep nginx

查看服务器端口占用情况:

1
netstat -ntlp

nginx启动:

1
nginx

nginx重启:

1
nginx -s reload

关闭nginx:

  • nginx -s stop : 快速停止nginx
  • nginx -s quit :完整有序的停止nginx

查看默认的nginx配置文件路径:

1
nginx -t

注:如果有nginx.conf配置的更改,需要重启nginx配置才会生效。如果只是更改dist包/html,则可以不重启nginx。

九、Nginx的性能优化

1. 调整工作进程数

Nginx的worker_processes指令控制工作进程的数量,通常设置为CPU核心数。这样可以充分利用服务器的多核处理能力。

1
worker_processes auto;

2. 优化工作进程设置

通过调整worker_connections指令,可以增加每个工作进程可以处理的最大连接数。这有助于提高并发处理能力。

1
2
3
events {
worker_connections 1024;
}

3. 启用Gzip压缩

启用Gzip压缩可以减少传输数据的大小,从而提高页面加载速度。

1
2
3
4
5
6
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和相关指令进行缓存设置。

1
2
3
4
5
6
7
8
9
10
11
12
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. 使用负载均衡

负载均衡可以分散请求到多个后端服务器,从而提高应用的可用性和性能。

1
2
3
4
5
6
7
8
9
10
11
12
http {
upstream backend {
server backend1.example.com;
server backend2.example.com;
}

server {
location / {
proxy_pass http://backend;
}
}
}

6. 调整连接超时设置

通过合理设置连接超时,可以释放未使用的资源,保持服务器高效运行。

1
2
3
4
5
6
http {
keepalive_timeout 65;
client_header_timeout 10s;
client_body_timeout 10s;
send_timeout 10s;
}

7. 禁用不必要的模块

禁用不必要的模块可以减少内存使用并提高性能。可以在编译Nginx时选择性地启用所需的模块。

1
./configure --without-http_autoindex_module --without-http_auth_basic_module

8. 优化文件描述符限制

增加文件描述符限制可以提高Nginx的并发处理能力。在/etc/security/limits.conf文件中设置:

1
2
* soft nofile 65536
* hard nofile 65536

通过以上优化步骤,你可以显著提高Nginx的性能。这些调整不仅能提高处理能力,还能改善用户体验。务必根据实际负载和需求测试和调整配置,以达到最佳效果。

十、项目部署(加ssl证书)【ps:以下的配置基于SmartAdmin框架】

http与https的差异与作用这里不加赘述,请自行学习!

这里写路径

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
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 时,若配置为

1
2
3
location /api1/ {
proxy_pass http://localhost:8080;
}

会代理到 http://localhost:8080/api1/xxx

2、 在带 URI 方式下,nginx 将使用诸如 alias 的替换方式对 URL 进行替换,例如当访问 http://localhost/api2/xxx 时,若配置为

1
2
3
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,配置为

1
2
3
location /test3/ {
proxy_pass http://localhost:8080;
}

按照不带 URI 方式的规则,首先保留 location 后的所有内容,即 http://localhost/test3/xxx。然后拼接代理路径后面,最终请求为 http://localhost:8080/test3/xxx。

再看一个例子,客户端请求为:http://localhost/test4/xxx,配置为

1
2
3
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,配置为

1
2
3
location /test7/ {
proxy_pass http://localhost:8080/aaa/bbb/;
}

按照带 URI 方式的规则,首先在客户端请求去除 location,获得剩下的右侧内容,即 xxx(获得的右侧内容)。然后拼接到代理路径中,最终请求为 http://localhost:8080/aaa/bbb/xxx。

再如,客户端请求为:http://localhost/test8/xxx,配置为

1
2
3
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

1
2
3
location /test9 {
proxy_pass http://localhost:8080/ddd/;
}

最终请求为 http://localhost:8080/ddd//xxx 这里会出现路径拼接错误的情况。

因此,为了避免出现这种错误,建议在配置 Nginx 反向代理时,要不 location 和 proxy_pass 都带斜杠,要不都不带。这样可以确保路径拼接的正确性,减少配置错误的可能性。在实际应用中,我们应该根据具体的需求和场景,谨慎选择带 URI 方式或不带 URI 方式,并严格遵循这个建议,以确保 Nginx 反向代理的稳定运行。

默认 提示块标签

default 提示块标签

primary 提示块标签

success 提示块标签

info 提示块标签

warning 提示块标签

danger 提示块标签