从认识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的负载均衡

  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大大提高了网站的响应速度,优化了用户体验,让网站的健壮性更上一层楼!

传统解析方式

动静分离解析

五、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 存放路径、日志存放路径和类型以 及配置文件的引入等。
        比如上面第二、五行配置的

        worker_processes  auto;

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

    3. 第二部分:events块

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

        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)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。

  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配置很繁琐,但是如果你只是需要上线一个网站,那么你只需要去修改两个地方即可:

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

七、Nginx部分页面优化

  1. 前端history模式404问题:

    location / {
        try_files $uri $uri/ /index.html;
    }

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

  2. 反向代理:

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

    1. 开发生产cors解决

    2. 开发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即可。

  3. 开启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;

    具体位置:

  4. 维护页面:
    作用:

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

    如何配置:

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

    具体位置:

  5. 一个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 / {}
     }

    具体位置:

    注意点:

    1. 这里的8081一定要你的服务器开放了这个端口才可以使用,否则你按照这个配置了也会访问不到(让后端去配)。

    2. 如果是云服务器(比如阿里云,腾讯云),则需要开放相应的入口为8081,否则用户访问不到。

  6. 动静分离

    作用:

    在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 : 快速停止nginx

  • nginx -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 反向代理的稳定运行。


从认识Nginx,到Nginx的使用
http://localhost:8090//archives/cong-ren-shi-nginx-dao-nginxde-shi-yong
作者
junmowen
发布于
2024年10月04日
许可协议