爽文式的带你快速理解Nginx

news2024/11/29 16:41:11

1 引入nginx的概念

Nginx是一个开源的Web服务器和反向代理服务器,它可以用来处理大量的网络请求和响应。Nginx使用事件驱动的非阻塞I/O模型,使其能够处理大量的并发连接。它还可以作为HTTP、HTTPS、SMTP、POP3和IMAP等协议的代理服务器,以及作为负载均衡器和HTTP缓存等使用。

Nginx由俄罗斯程序员Igor Sysoev编写,并在2004年首次发布。它是许多大型网站和Web应用程序的核心组件,包括Netflix、WordPress.com、Instagram、Pinterest和AOL等。

Nginx的特点是快速、可扩展性高、可靠性强、功能丰富,并且易于配置和使用。它支持许多高级功能,如SSL/TLS加密、压缩、身份验证、重写URL、负载均衡和故障切换等。

2 什么是正向代理以及什么是反向代理?

正向代理和反向代理是代理服务器的一种分类方式,根据代理服务器在客户端和目标服务器之间的位置不同来区分的。

正向代理是指位于客户端和原始服务器之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。使用代理上网就是正向代理的一个应用实例。正向代理可以隐藏客户端的真实身份和位置,并且可以绕过访问限制、提供缓存和性能优化,增加访问的安全性。

反向代理是指代理服务器来接受客户端的网络访问连接请求,然后将请求有策略地转发给网络中实际工作的业务服务器,并将从业务服务器处理的结果返回给网络上发起连接请求的客户端。反向代理隐藏了目标服务器的真实IP地址,保护了服务器的隐私,同时也可以提高目标服务器的处理能力,缓解服务器的压力。反向代理一般应用在Web服务器上,可以作为负载均衡和故障转移的解决方案。

3 负载均衡

Nginx 扮演了反向代理服务器的角色,它是依据什么样的规则进行请求分发的呢?不用的项目应用场景,分发的规则是否可以控制呢?

这里提到的客户端发送的、Nginx 反向代理服务器接收到的请求数量,就是我们说的负载量

请求按照一定的规则进行分发到不同的服务器处理的规则,就是一种均衡规则。所以将服务器接收到的请求按照规则分发的过程,称为负载均衡

Nginx支持多种负载均衡调度算法,常见的有以下几种:

  • 轮询(RoundRobin):将请求按顺序分配给每个服务器,每个请求按时间顺序逐一分配到不同的服务器,如果某个服务器宕机,会自动剔除故障服务器,使用户访问不受影响。
  • IP Hash:根据客户端的IP地址进行哈希计算,将同一客户端的请求分配给同一台服务器处理,保证同一客户端的请求都被同一台服务器处理。
  • Least Connections:最少连接调度算法,会自动将新的请求发送给当前连接数最少的服务器,使每台服务器的负载尽可能均衡。
  • Weighted Round Robin:加权轮询调度算法,根据服务器的处理能力为每台服务器分配不同的权重,将请求按权重分配给服务器。
  • Weighted Least Connections:加权最少连接调度算法,根据服务器的处理能力为每台服务器分配不同的权重,将新的请求发送给当前连接数最少的服务器,同时考虑服务器的权重。
  • Least Time:最少时间调度算法,将请求发送给响应时间最短的服务器。
  • Hash-based:基于哈希的调度算法,根据请求的某个属性进行哈希计算,将同一属性的请求分配给同一台服务器处理。

4 nginx 的使用比较简单

  1. 查看nginx的安装路径
D:\opt\dev\nginx\nginx-1.24.0>where nginx
D:\opt\dev\nginx\nginx-1.24.0\nginx.exe
  1. 查看nginx的进程号
[root@manage-server-5b9bfc576c-bphf5 tomcat]# ps -ef | grep nginx
root       669   659  0 09:16 pts/2    00:00:00 grep --color=auto nginx
  1. 启动
PS D:\opt\dev\nginx\nginx-1.24.0> .\nginx.exe
  1. 优雅重启
D:\opt\dev\nginx\nginx-1.24.0>nginx.exe -s reload
  1. nginx服务停止
D:\opt\dev\nginx\nginx-1.24.0>nginx.exe -s stop

提示:

如果不想每次都敲命令,可以在nginx安装目录下新添一个启动批处理文件startup.bat,双击即可运行。内容如下:

@echo off 
rem 如果启动前已经启动nginx并记录下pid文件,会kill指定进程 
nginx.exe -s stop 
​
rem 测试配置文件语法正确性 
nginx.exe -t -c conf/nginx.conf 
​
rem 显示版本信息 
nginx.exe -v 
​
rem 按照指定配置去启动nginx 
nginx.exe -c conf/nginx.conf

以下是Nginx的默认路径:

事实上,只需知道Nginx配置路径,其他路径均可在/etc/nginx/nginx.conf 以及/etc/nginx/conf.d/default.conf 中查询到。

5 配置文件描述

user  nginx;
worker_processes  auto;
worker_cpu_affinity auto;
worker_rlimit_nofile 65535;

events {
    use epoll;
    worker_connections  20480;
}

http {
    include  /etc/nginx/mime.types;
    default_type  application/octet-stream;
    log_format main '$request_time $upstream_response_time $remote_addr $remote_user [$time_local] "$request" $http_host $status $upstream_status $body_bytes_sent "$http_referer" $ssl_protocol $ssl_cipher $upstream_addr "$http_user_agent"';
    access_log  /var/log/nginx/access.log  main;
    error_log  /var/log/nginx/error.log error;
    sendfile  on;
    keepalive_timeout  65;

    gzip on;
    gzip_min_length 1k;
    gzip_buffers    4 16k;
    gzip_http_version 1.0;
    gzip_comp_level 6;
    gzip_types text/htm text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
    gzip_vary on;

    server {
	    listen       80;
	    server_name  localhost;
	    client_max_body_size 50M;

	    location /dida-runtime-micro {
	        root   /apps;
	        index  index.html;
	        if (!-e $request_filename){
	        	rewrite ^/(.*) /dida-runtime-micro/index.html last;
	        	break;
	        }
	    }

        location /dida-runtime-server {
            proxy_pass  http://dida-runtime-server:8080/dida-runtime-server;
            proxy_redirect off;
            # bForwarded-ForIP
            proxy_set_header  Host  $host:$server_port;
            proxy_set_header  X-Real-IP  $remote_addr;
            proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
            proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        }
        
         location /manage-server {
            proxy_pass  http://10.110.34.125:8080/manage-server;
            proxy_redirect off;
            # bForwarded-ForIP
            proxy_set_header  Host  $host:$server_port;
            proxy_set_header  X-Real-IP  $remote_addr;
            proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
            proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        }

	    location /status {
            #check_status;
            stub_status on;
            access_log   off;
            allow all;
        }

	    error_page   500 502 503 504  /50x.html;
	    location = /50x.html {
	        root   /usr/share/nginx/html;
	    }
	}
}

5.1 全局块配置

user  nginx; # 配置用户或用户组 这里用户与用户组是同一个 nginx
worker_processes  auto; # 允许生成的进程数,默认为1。这里的进程数是根据CPU的核数来设置的。auto就是自动按CPU核数自动设置。
worker_cpu_affinity auto;
worker_rlimit_nofile 65535;
error_log  logs/error.log error;		#制定日志路径,级别。这个设置可以放入全局块,
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
pid        logs/nginx.pid;    #指定nginx进程运行文件存放地址

配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。

  • worker_processes是Nginx配置文件中用于设置工作进程数量的参数。它控制着Nginx服务器能够同时处理的连接数量。通常情况下,该参数的值应该设置为服务器的CPU核心数或者更高,以确保最大化利用服务器资源,同时保证服务器的稳定性和性能。例如,如果服务器的CPU核心数为4,可以将worker_processes设置为4,这样Nginx服务器就能够同时处理4个并发请求。

    但是,需要根据实际的服务器硬件配置、并发请求量等因素,对worker_processes参数进行调整,以确保最佳的性能和稳定性。例如,如果服务器的CPU核心数为8,但是并发请求量较低,可以将worker_processes设置为4,这样就能够避免服务器资源的浪费。

    同时需要注意的是,在多个工作进程情况下,应该适当增加TCP连接池的大小以确保每个工作进程都可以处理足够的请求。可以通过worker_connections参数来设置每个工作进程的最大连接数,例如:worker_connections1024;这将为每个工作进程提供最多1024个连接。

  • worker_cpu_affinity是Nginx配置文件中用于设置工作进程与CPU亲和性的参数。它的作用是控制Nginx的工作进程在哪些CPU核心上运行,以提高服务器的性能和稳定性。

    在默认情况下,Nginx的工作进程会在任何可用的CPU核心上运行。但是,如果服务器的CPU核心数较多,而并发请求量较低,可以通过worker_cpu_affinity参数将工作进程绑定到特定的CPU核心上,以减少上下文切换和CPU缓存的失效,提高服务器的性能。

    worker_cpu_affinity参数的值应该是一个CPU核心的列表,可以使用具体的核心编号或者核心掩码来表示。例如,worker_cpu_affinity01;表示将工作进程绑定到CPU核心0和1上。

    需要注意的是,设置worker_cpu_affinity参数需要具有管理员权限,并且在更改配置文件后需要重新启动Nginx服务器才能生效。同时,需要根据实际的服务器硬件配置和并发请求量等因素进行调整,以确保最佳的性能和稳定性。

  • worker_rlimit_nofile是Nginx配置文件中用于设置工作进程可打开的最大文件描述符数量的参数。在Linux系统中,每个进程都有一个限制,即可以打开的最大文件描述符数量,包括打开的套接字、文件、管道等。

    worker_rlimit_nofile参数用于设置Nginx工作进程可以打开的最大文件描述符数量。默认值通常是1024,但是如果服务器的并发连接数较多,可能需要增加该值以避免达到文件描述符的上限。例如,可以将worker_rlimit_nofile设置为65535,以允许工作进程打开更多的文件描述符。

    需要注意的是,增加worker_rlimit_nofile参数的值需要具有管理员权限,并且在更改配置文件后需要重新启动Nginx服务器才能生效。同时,需要根据实际的服务器硬件配置和并发请求量等因素进行调整,以确保最佳的性能和稳定性。

  • error_log是Nginx配置文件中用于设置错误日志的文件路径和级别的参数。它可以指定日志文件的位置和日志级别,以便记录Nginx服务器运行时的错误信息。

    该参数的值应该是一个字符串,包含日志文件的路径和日志级别。日志级别可以是以下之一:debug、info、notice、warn、error、crit、alert或emerg。例如,error_log
    /var/log/nginx/error.log
    warn;将错误日志记录到/var/log/nginx/error.log文件中,并且只记录警告级别以上的错误信息。

    默认情况下,error_log参数的值是error_log /var/log/nginx/error.log
    error;,即将错误日志记录到/var/log/nginx/error.log文件中,并且只记录错误级别以上的错误信息。

    需要注意的是,设置error_log参数需要具有管理员权限,并且在更改配置文件后需要重新启动Nginx服务器才能生效。同时,需要根据实际的服务器硬件配置和并发请求量等因素进行调整,以确保最佳的性能和稳定性。

  • pid是Nginx配置文件中用于指定存储主进程ID的文件路径的参数。在Nginx服务器启动后,主进程的ID会被写入到该文件中。

    该参数的值应该是一个字符串,包含存储主进程ID的文件路径。例如,pid
    /var/run/nginx.pid;将主进程ID存储到/var/run/nginx.pid文件中。

    默认情况下,pid参数的值是pid
    /var/run/nginx.pid;,即将主进程ID存储到/var/run/nginx.pid文件中。

    需要注意的是,设置pid参数需要具有管理员权限,并且在更改配置文件后需要重新启动Nginx服务器才能生效。同时,需要根据实际的服务器硬件配置和并发请求量等因素进行调整,以确保最佳的性能和稳定性。

5.2 events块配置

accept_mutex on;  
multi_accept on;  
use epoll;      
worker_connections  1024;    #最大连接数,默认为1024(早期是512)

配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。

  • worker_connections是Nginx配置文件中用于设置每个工作进程允许的最大并发连接数的参数。它决定了Nginx服务器可以同时处理多少个客户端连接。

    该参数的值应该是一个整数,表示每个工作进程允许的最大并发连接数。例如,worker_connections 4096;表示每个工作进程允许最大并发连接数为4096。

    需要注意的是,worker_connections参数的值应根据服务器性能、内存和并发请求量等因素进行调整。如果并发连接数设置过小,可能会导致服务器无法处理更多的客户端请求;如果设置过大,可能会导致服务器资源浪费和性能下降。

    在Nginx配置文件中,可以通过以下方式设置worker_connections参数:

    需要注意的是,在更改配置文件后,需要重新启动Nginx服务器才能使配置生效。

  • Nginx默认使用epoll作为其事件驱动模型。在Linux操作系统上,Nginx使用epoll作为其高性能网络I/O模型,这使得它能够处理大量并发连接。

    Epoll是Linux操作系统提供的一种I/O多路复用技术,它可以监视多个文件描述符(sockets、files等),并在它们就绪时通知应用程序。相比传统的select或poll技术,epoll能够更高效地处理大量文件描述符,因此在高并发环境下表现更出色。

    Nginx在设计之初就充分考虑了性能因素,并选择了epoll作为其默认的网络I/O模型。在Nginx的配置文件中,你不需要显式指定使用epoll,因为它是默认的行为。

    请注意,epoll只适用于Linux操作系统。在其他操作系统(如Windows或macOS)上,Nginx会使用其他适合该平台的高性能网络I/O模型。

  • Nginx中的accept_mutex是一个用于控制多个工作进程接收连接的参数。

    当一个新连接到达时,如果有多个工作进程处于休眠状态,accept_mutex会保证只有一个工作进程会被唤醒并处理该连接,而其他工作进程将继续保持休眠状态。如果没有激活accept_mutex,则所有的工作进程都会被唤醒,但只有一个工作进程能获取新连接,其它的工作进程会重新进入休眠状态,这种现象在Nginx中被称为“惊群问题”。

    Nginx默认激活了accept_mutex,这是为了防止惊群问题的发生。如果关闭了它,可能会引起一定程度的惊群问题,表现为上下文切换增多或者负载上升。但如果你的网站访问量比较大,为了系统的吞吐量,建议关闭它。

  • 在Nginx中,multi_accept是一个用于控制工作进程接收新连接方式的参数。

    当设置为on时,multi_accept允许一个工作进程同时接受多个新连接。这可以提高服务器的吞吐量,因为工作进程可以同时处理多个连接,而不是依次处理每个连接。

    当设置为off时,multi_accept将禁用多个连接的同时接收。工作进程将按照顺序逐个接收新连接,并在处理完一个连接后再接收下一个连接。这可能会导致性能下降,因为工作进程需要逐个处理连接,而不是同时处理多个连接。

    需要注意的是,multi_accept参数的效果取决于操作系统的配置和性能。在某些情况下,启用multi_accept可能会导致系统资源的使用增加,因此需要根据服务器的实际情况进行权衡和测试。

    默认情况下,Nginx的multi_accept参数是启用的(即设置为on)。如果你希望禁用多个连接的同时接收,可以将multi_accept设置为off。这个设置可以在Nginx的配置文件中的events块中进行配置,例如:
    在这里插入图片描述

5.3 http块配置

可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。

  • 在Nginx的配置文件中,http模块是一个顶级模块,用于定义HTTP服务器的配置。include指令是http模块的一个指令,用于将其他Nginx配置文件的内容包含到当前的配置文件中。

    使用include指令,你可以将常见的配置片段(如代理设置、负载均衡配置等)放在一个单独的文件中,然后在多个配置文件中使用include指令引用它。这样可以避免重复的配置,提高配置文件的可维护性。

    在http模块中使用include指令的基本语法如下:
    在这里插入图片描述
    其中,/path/to/file是要包含的配置文件的路径。可以是相对路径或绝对路径。
    以下是一个示例,演示了如何在http模块中使用include指令:
    在这里插入图片描述
    上述示例中,include指令引用了/etc/nginx/conf.d/目录下所有以.conf为扩展名的文件。这意味着所有在该目录下的配置文件的内容都将被包含到当前的配置文件中。

    请注意,使用include指令包含的配置文件必须符合Nginx的配置语法,否则可能会导致配置错误。

  • 在Nginx的配置文件中,http模块是一个顶级模块,用于定义HTTP服务器的配置。log_format是http模块的一个指令,用于定义日志格式。

    通过log_format指令,你可以自定义Nginx访问日志和错误日志的格式。你可以指定日志中包含的字段和它们的顺序,以满足你的需求。

    在http模块中使用log_format指令的基本语法如下:
    在这里插入图片描述

    1. name是你为日志格式指定的名称。
    2. escape参数可选,指定如何编码输出中的特殊字符。默认值是default,表示使用默认的字符编码方式。你还可以选择json,表示使用JSON编码方式。
    3. string是日志格式的定义,它是一个包含各种字段的字符串。 以下是一个示例,演示了如何在http模块中使用log_format指令:
      在这里插入图片描述
      上述示例中,我们定义了一个名为main的日志格式。日志中包含了诸如远程IP地址、用户名、请求时间、请求内容等信息。你可以根据需要自定义日志格式,并将其应用到访问日志和错误日志中。
      使用自定义的日志格式后,你可以在Nginx的日志文件中看到按照指定格式记录的访问和错误日志。
  • 在Nginx的配置文件中,http模块是一个顶级模块,用于定义HTTP服务器的配置。access_log是http模块的一个指令,用于指定访问日志的配置。

    通过access_log指令,你可以定义访问日志的文件路径、日志格式和日志级别等。访问日志记录了客户端对Nginx服务器的请求和响应信息,对于监控和分析服务器的使用情况非常有用。

    在这里插入图片描述
    上述示例中,我们指定了访问日志的文件路径为/var/log/nginx/access.log,并使用名为main的日志格式。你可以根据需要自定义日志格式,或者选择已定义的日志格式。

    通过使用access_log指令,你可以配置Nginx记录访问日志,以便进行访问统计、性能分析和故障排除等操作。

  • 在Nginx的配置文件中,http模块是一个顶级模块,用于定义HTTP服务器的配置。sendfile是http模块的一个指令,用于控制Nginx服务器如何发送文件。

    sendfile指令决定了Nginx服务器在发送文件时是否使用操作系统的sendfile()系统调用。sendfile()系统调用是一种高效的文件发送方式,它可以减少数据在内核空间和用户空间之间的复制次数,从而提高文件发送的性能。

    在http模块中使用sendfile指令的基本语法如下:
    在这里插入图片描述

    • on表示启用sendfile()系统调用。这是默认值,可以提高文件发送的性能。
    • off表示禁用sendfile()系统调用。在某些情况下,禁用sendfile()可能有用,例如在使用代理模块时。 请注意,sendfile指令在默认情况下是启用的,如果你没有明确设置该指令,Nginx将默认使用sendfile()系统调用来发送文件。
  • 在Nginx的配置文件中,http模块是一个顶级模块,用于定义HTTP服务器的配置。tcp_nopush是http模块的一个指令,用于控制Nginx服务器在发送数据时如何使用TCP/IP协议栈。

    tcp_nopush指令决定了Nginx服务器是否使用TCP/IP协议的PUSH标志来发送数据。PUSH标志是一种机制,它允许TCP/IP协议栈将数据立即发送到对端,而不等待对端请求。
    在这里插入图片描述

    1. on表示启用TCP/IP协议的PUSH标志。这可能会导致数据更快地发送到对端,但在某些情况下可能会导致网络拥塞。
    2. off表示禁用TCP/IP协议的PUSH标志。这是默认值,可以减少网络拥塞的风险,但可能会导致数据发送延迟。
      请注意,tcp_nopush指令在默认情况下是禁用的,如果你没有明确设置该指令,Nginx将默认禁用TCP/IP协议的PUSH标志。
  • 在Nginx的配置文件中,http模块是一个顶级模块,用于定义HTTP服务器的配置。keepalive_timeout是http模块的一个指令,用于设置HTTP长连接的超时时间。

    HTTP长连接是一种机制,允许客户端与服务器之间保持持久连接,以便在多个请求和响应之间重用TCP连接。keepalive_timeout指令决定了长连接的超时时间,即在指定的时间内没有新的请求到达时,连接将被关闭。

    在http模块中使用keepalive_timeout指令的基本语法如下:
    在这里插入图片描述
    timeout是一个整数值,表示长连接的超时时间,以秒为单位。如果在指定的时间内没有新的请求到达,连接将被关闭。
    header_timeout是可选的,表示在HTTP响应头中设置的超时时间。如果未指定,将使用timeout的值。
    以下是一个示例,演示了如何在http模块中使用keepalive_timeout指令:
    在这里插入图片描述
    请注意,keepalive_timeout指令在默认情况下是禁用的,如果你没有明确设置该指令,Nginx将默认禁用HTTP长连接。

  • 在Nginx的配置文件中,http模块是一个顶级模块,用于定义HTTP服务器的配置。keepalive_requests是http模块的一个指令,用于限制每个TCP连接上可以处理的最大请求数量。

    HTTP长连接是一种机制,允许客户端与服务器之间保持持久连接,以便在多个请求和响应之间重用TCP连接。keepalive_requests指令用于限制每个TCP连接上可以处理的最大请求数量。当达到指定的请求数量后,连接将被关闭。
    以下是一个示例,演示了如何在http模块中使用keepalive_requests指令:
    在这里插入图片描述
    上述示例中,我们将keepalive_requests指令设置为100。这意味着每个TCP连接上可以处理的最大请求数量是100个。当达到100个请求后,连接将被关闭。

    请注意,keepalive_requests指令在默认情况下没有限制,如果你没有明确设置该指令,Nginx将默认没有限制每个TCP连接上的请求数量。

  • 在Nginx的配置文件中,http模块是一个顶级模块,用于定义HTTP服务器的配置。gzip是http模块的一个指令,用于启用或禁用压缩传输功能。

    通过gzip指令,你可以控制Nginx服务器对响应数据进行压缩,以减小传输数据的大小,从而提高网络传输的效率。启用压缩传输可以加快页面加载速度,并减少带宽的使用。

    在http模块中使用gzip指令的基本语法如下:
    在这里插入图片描述
    以下是一个示例,演示了如何在http模块中使用gzip指令:
    在这里插入图片描述
    上述示例中,我们将gzip指令设置为off,禁用了压缩传输功能。这意味着Nginx服务器不会对响应数据进行压缩。

    请注意,gzip指令在默认情况下是启用的,如果你没有明确设置该指令,Nginx将默认启用压缩传输。如果你禁用了压缩传输功能,可能会导致网络传输效率下降,因为未经压缩的数据会占用更多的带宽。

5.4 server块配置

在Nginx的配置文件中,server模块是一个顶级模块,用于定义一个虚拟服务器。

  • 在Nginx的配置文件中,server模块是一个顶级模块,用于定义一个虚拟服务器。listen是server模块的一个指令,用于指定虚拟服务器监听的IP地址和端口号。

    通过listen指令,你可以指定虚拟服务器监听的IP地址和端口号,以便接受客户端的请求。你可以使用IP地址和端口号来区分不同的虚拟服务器,从而实现多个域名或站点共享同一个Nginx服务器。

    在server模块中使用listen指令的基本语法如下:
    在这里插入图片描述
    以下是一个示例,演示了如何在server模块中使用listen指令:
    在这里插入图片描述
    上述示例中,我们指定了虚拟服务器监听的端口号为80,即HTTP的默认端口。这意味着该虚拟服务器将接受在80端口上发送的HTTP请求。

    你还可以使用多个listen指令来指定多个监听的IP地址和端口号。例如:
    在这里插入图片描述
    上述示例中,我们指定了虚拟服务器监听两个端口号:80和443。其中,443端口上还启用了SSL加密传输。这样,该虚拟服务器将接受在80端口上发送的HTTP请求和在443端口上发送的HTTPS请求。

    请注意,每个虚拟服务器至少需要有一个listen指令来指定监听的IP地址和端口号。否则,该虚拟服务器将无法接收任何请求。

  • 在Nginx的配置文件中,server模块是一个顶级模块,用于定义一个虚拟服务器。server_name是server模块的一个指令,用于指定虚拟服务器的域名或域名列表。

    通过server_name指令,你可以指定虚拟服务器所对应的域名或域名列表。当客户端发送请求时,Nginx会根据请求头中的HOST字段,将请求转发到匹配的虚拟服务器中。

    在server模块中使用server_name指令的基本语法如下:
    在这里插入图片描述
    上述示例中,我们指定了虚拟服务器的域名为domain.com和www.domain.com。这意味着当客户端发送请求时,Nginx将根据请求头中的HOST字段,将请求转发到相应的虚拟服务器中。

    除了单个域名外,server_name指令还可以配置多个域名或通配符。以下是一些示例:
    在这里插入图片描述
    上述示例中,我们指定了虚拟服务器可以匹配以*.domain.com为后缀的任何域名。例如,test.domain.com和www.test.domain.com都将会被匹配到该虚拟服务器。

    此外,你还可以使用正则表达式来匹配更复杂的域名规则。例如:
    在这里插入图片描述
    上述示例中,我们使用了正则表达式来匹配以www开头,后跟数字和.号,再跟(domain1|domain2)中的任意一个.号,最后以.com$结尾的域名。其中,正则表达式中的(?i)表示忽略大小写。例如,www1.domain1.com和www2.domain2.com都会被匹配到该虚拟服务器。

    需要注意的是,每个虚拟服务器可以有一个或多个server_name指令。当请求头中的HOST字段与任何一个server_name指令匹配成功时,Nginx会将请求转发到对应的虚拟服务器中。因此,可以根据不同的域名或域名列表来配置不同的虚拟服务器,实现基于名称的虚拟主机配置。

  • 在Nginx的配置文件中,server模块是一个顶级模块,用于定义一个虚拟服务器。charset是server模块的一个指令,用于指定虚拟服务器的字符集。

    通过charset指令,你可以指定虚拟服务器使用的字符集,这对于正确解析客户端的请求和生成响应非常重要。字符集定义了文本数据的编码方式,例如UTF-8、GBK等。

    在server模块中使用charset指令的基本语法如下:
    在这里插入图片描述

    • charset_name是一个指定字符集的名称。Nginx支持的字符集包括UTF-8、ISO-8859-1等。

    以下是一个示例,演示了如何在server模块中使用charset指令:
    在这里插入图片描述
    上述示例中,我们指定了虚拟服务器的字符集为UTF-8。这意味着Nginx将使用UTF-8编码方式来解析客户端的请求和生成响应。

    需要注意的是,如果未指定charset指令,Nginx将使用默认值ISO-8859-1。如果客户端发送请求时使用了不同的字符集,可能会导致解析错误或出现乱码。因此,为了正确处理请求和生成响应,建议在server模块中显式地指定字符集。

  • 在Nginx的配置文件中,server模块是一个顶级模块,用于定义一个虚拟服务器。access_log是server模块的一个指令,用于指定虚拟服务器的访问日志的存放路径和日志格式。

    通过access_log指令,你可以指定虚拟服务器访问日志的存放路径和日志格式。日志文件用于记录客户端与服务器之间的请求和响应信息,包括请求时间、请求IP、请求URI、响应状态码等。通过分析日志文件,可以监控网站流量、分析用户行为、诊断性能问题等。

    在server模块中使用access_log指令的基本语法如下:
    在这里插入图片描述

    • path(存放路径)是必需的,指定了访问日志文件的存放路径。可以使用绝对路径或相对路径。
    • format(日志格式)是可选的,指定了访问日志的格式。可以使用默认格式或自定义格式。如果未指定日志格式,将使用默认格式。

    以下是一个示例,演示了如何在server模块中使用access_log指令:
    在这里插入图片描述
    上述示例中,我们指定了虚拟服务器的访问日志文件存放路径为logs/access.log,日志格式为main。main格式是Nginx默认的日志格式,会记录请求时间、请求IP、请求URI、响应状态码等信息。

    除了默认格式外,还可以使用自定义格式。自定义格式可以包括自定义字段和字段之间的分隔符。以下是一个示例,演示了如何在access_log指令中使用自定义格式:

    在这里插入图片描述

    上述示例中,我们指定了自定义格式为:$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for",每个字段之间使用空格分隔。这意味着访问日志将记录请求IP、请求用户、请求时间、请求URI、响应状态码、响应大小、来源URL、用户代理等信息。

    需要注意的是,每个虚拟服务器都可以拥有自己的访问日志文件和日志格式。如果你有多个虚拟服务器,可以通过定义不同的access_log指令来分别记录每个虚拟服务器的访问日志。同时,还可以在全局设置中定义默认的访问日志文件和日志格式。

  • 在Nginx的配置文件中,location是server模块中的块级指令,用于设置如何处理客户端发来的请求URI。location指令可以包含正则表达式,也可以不包含。

    通过配置location指令块,可以决定客户端发过来的请求URI如何处理(是映射到本地文件还是转发出去)及被哪个location处理。

    以下是location指令的基本语法:
    在这里插入图片描述
    其中,/pattern是待匹配的请求字符串。可以是具体的URI,也可以是正则表达式。

    当Nginx服务器在搜索匹配location的时候,会先使用不包含正则表达式进行匹配,找到一个匹配度最高的一个,然后再通过包含正则表达式的进行匹配。如果能匹配到直接访问,匹配不到就使用刚才匹配度最高的那个location来处理请求。

    在上述示例中,我们配置了一个简单的location指令块,用于处理与/demo匹配的请求。当客户端发送请求到/demo时,Nginx将根据该请求URI进行相应处理。

    需要注意的是,每个server模块可以包含多个location指令块,以处理不同的请求URI。这些location指令块根据URI进行匹配,可以被用来指定不同的文件或代理转发等配置。因此,理解并正确使用location指令对于配置Nginx服务器至关重要。

  • 在Nginx的server模块中,location指令用于匹配请求的URL路径,并指定相应的处理方式。root指令和index指令是location指令的两个常用参数。

    1. root指令:
    • root指令用于指定请求URL路径的根目录,即请求的文件和目录的起始位置。
    • 当请求URL路径匹配到某个location指令时,Nginx会从该location指令中指定的根目录下寻找对应的文件或目录。
    • root指令的值可以是绝对路径或相对路径。如果是相对路径,它将相对于Nginx配置文件所在的目录。

    如果没有指定root指令,Nginx将使用默认的根目录,通常是启动Nginx时的当前目录。示例:
    在这里插入图片描述
    在上述示例中,当请求URL路径以/images/开头时,Nginx将从/var/www/images/目录下寻找对应的文件或目录。

  • index指令:

  • index指令用于指定默认的索引文件,当请求的URL路径以斜杠(/)结尾时,Nginx会自动尝试将其作为索引文件来处理。

  • 索引文件通常是一个包含其他超链接的HTML文件,用于展示目录内容。

  • 如果没有指定index指令,Nginx将使用默认的索引文件,通常是index.html。示例: 在这里插入图片描述
    在上述示例中,当请求的URL路径是根路径(即以斜杠结尾)时,Nginx将从/var/www/目录下寻找名为index.html的索引文件来处理请求。

    使用root和index指令,可以灵活地配置Nginx服务器,以便根据不同的URL路径请求,提供正确的文件和目录服务。

  • 在 Nginx 的 server 模块中,location 块用于匹配特定的 URL 路径,并为该路径指定相应的配置。而
    proxy_pass 指令用于将客户端的请求代理到另一个服务器

    当使用 proxy_pass 指令时,Nginx 会将客户端的请求转发到指定的服务器,并将该服务器的响应返回给客户端。这对于在 Nginx上构建反向代理服务器非常有用,可以将来自客户端的请求转发到后端的真实服务器,然后将响应返回给客户端。

    下面是一个示例配置,展示了如何在 location 块中使用 proxy_pass 指令:
    在这里插入图片描述
    在上面的配置中,当客户端访问 example.com 的根路径时,Nginx 会将请求代理到
    http://backend_server。你需要将 backend_server 替换为实际的后端服务器的地址。

    还可以使用其他指令来配置代理行为,例如 proxy_set_header 指令可以用来设置请求头信息,proxy_redirect
    指令可以用来处理重定向等。

    需要注意的是,使用 proxy_pass 指令时,要确保后端服务器的地址是可达的,并且 Nginx 与后端服务器之间的网络连接没有问题

  • 在 Nginx 的 server 模块中,location 块用于匹配特定的 URL 路径,并为该路径指定相应的配置。而
    proxy_redirect 指令用于在代理请求时处理重定向

    当使用 proxy_pass 指令将请求代理到另一个服务器时,如果后端服务器返回一个重定向响应,Nginx 可以根据
    proxy_redirect 指令的设置来处理这个重定向。

    下面是一个示例配置,展示了如何在 location 块中使用 proxy_redirect 指令:

    在这里插入图片描述
    在上面的配置中,当客户端访问 example.com 的根路径时,Nginx 会将请求代理到
    http://backend_server。如果后端服务器返回一个重定向响应,例如
    http://backend_server/new_path,Nginx 会根据 proxy_redirect 指令的设置,将其转换为
    https://example.com/new_path。

    需要注意的是,proxy_redirect 指令需要设置两个参数:第一个参数是后端服务器返回的原始重定向地址,第二个参数是 Nginx
    应该将其转换为的新地址。

    此外,还可以使用其他指令来配置代理行为,例如 proxy_set_header 指令可以用来设置请求头信息。

  • 在 Nginx 的 server 模块中,location 块用于匹配特定的 URL 路径,并为该路径指定相应的配置。而
    proxy_set_header 指令用于设置代理请求的请求头信息

    当使用 proxy_pass 指令将请求代理到另一个服务器时,可以使用 proxy_set_header
    指令来设置请求头信息,以便后端服务器能够正确识别和处理请求。

    下面是一个示例配置,展示了如何在 location 块中使用 proxy_set_header 指令:
    在这里插入图片描述
    在上面的配置中,当客户端访问 example.com 的根路径时,Nginx 会将请求代理到
    http://backend_server。proxy_set_header 指令设置了两个请求头信息:Host 和 X-Real-IP。

    proxy_set_header Host $host:$server_port;
    将客户端请求的主机头信息传递给后端服务器。这对于后端服务器识别请求的来源非常重要。

    proxy_set_header X-Real-IP $remote_addr; 将客户端的真实 IP 地址设置为请求头信息
    X-Real-IP,以便后端服务器能够获取到客户端的真实 IP 地址。

    需要注意的是,proxy_set_header 指令可以根据需要设置多个请求头信息,只需在指令中添加相应的参数和值即可。

以下是一些常用的 proxy_set_header 设置信息:
Host:客户端请求的主机头信息,用于后端服务器识别请求的来源。

proxy_set_header Host $host;

X-Real-IP:客户端的真实 IP 地址,用于后端服务器获取客户端的真实 IP。

proxy_set_header X-Real-IP $remote_addr;

X-Forwarded-For:代理服务器列表,用于记录请求经过的代理服务器。

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

X-Forwarded-Proto:原始请求的协议,用于后端服务器识别请求是通过 HTTP 还是 HTTPS 发送的。

proxy_set_header X-Forwarded-Proto $scheme;

X-Forwarded-Host:原始请求的主机头信息,用于后端服务器识别原始请求的主机。

proxy_set_header X-Forwarded-Host $host;

X-Forwarded-Port:原始请求的端口号,用于后端服务器识别原始请求的端口。

proxy_set_header X-Forwarded-Port $server_port;
  • 在 Nginx 的 server 模块中,location 块用于匹配特定的 URL 路径,并为该路径指定相应的配置。而
    proxy_next_upstream 指令用于定义在什么情况下将请求传递给下一个上游服务器

    当使用 proxy_pass 指令将请求代理到另一个服务器时,如果后端服务器无法处理请求或返回错误,Nginx 可以根据
    proxy_next_upstream 指令的设置来决定是否将请求传递给下一个上游服务器。

    以下是一些常用的 proxy_next_upstream 参数:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 在 Nginx 的 server 模块中,error_page 指令用于定义错误页面的位置,以及当发生特定错误时如何返回这些页面。

    下面是 error_page 指令的一般语法:
    在这里插入图片描述

    • code:指定要处理的错误代码或范围。可以使用多个 error_page 指令来处理不同的错误代码。
    • response:可选参数,指定要返回的 HTTP 响应代码。如果没有指定,默认使用与错误代码对应的默认响应代码。
    • uri:指定错误页面的 URI。可以是相对路径或绝对路径。

    下面是一个示例配置,展示如何使用 error_page 指令:
    在这里插入图片描述
    在上面的配置中,当发生 404 错误时,Nginx 会返回 /404.html 页面;当发生 500、502 或 503
    错误时,Nginx 会返回 /50x.html 页面;当发生 499 错误时,Nginx 会返回 /custom_error.html
    页面,并将 HTTP 响应代码设置为 200。

    请注意,error_page 指令必须在 server 模块或 location 块中定义。此外,错误页面必须存在并可以被 Nginx访问到。

  • 在 Nginx 的 server 模块中,location = /50x.html 块用于匹配访问 /50x.html
    路径的请求,并指定相应的配置。

    以下是一个示例配置,展示如何在 location = /50x.html 块中进行配置:
    在这里插入图片描述
    在上面的配置中,当访问 example.com/50x.html 时,Nginx 会从 /path/to/error/pages
    目录下寻找 50x.html 文件并返回。使用 internal 参数可以限制该块只能被内部访问,即不能直接通过 URL 访问。

    请注意,location = /50x.html 块中的路径和参数需要根据实际情况进行调整。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1008060.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PM2 | NodeJS应用进程管理工具—PM2的基本使用

目录 1. pm2 简介 2. pm2的主要特性 3. 常用命令 3.1 pm2的安装与更新 3.1.1 pm2安装 3.1.2 pm2更新 3.2 pm2 启动运行指定的程序 3.2.1 正常启动应用程序 3.2.2 启动应用程序时并设置name 3.3 pm2 停止指定运行的程序 3.3.1 停止特定的应用 3.3.2 停止所有的应用 …

SpringMVC之JSON数据返回与异常处理机制---全方面讲解

一,JSON数据返回的理解 在Spring MVC中,当需要将数据以JSON格式返回给客户端时,可以使用ResponseBody注解或RestController注解将Controller方法的返回值直接转化为JSON格式并返回。这使得开发者可以方便地将Java对象转换为JSON,并…

【AIGC】斯坦福小镇升级版——AI-Town源码解读

写在前面的话: 接上一篇斯坦福小镇升级版——AI-Town搭建指南,本本篇将解读 AI-Town 使用的技术栈、代码架构、与LLM的交互,以及与斯坦福AI小镇的对比结果(如想直接看结论可跳到文章最后) 整体架构 技术栈 AI-Town 使…

“金钥匙”转动!安全狗成功护航第二十三届中国国际投资贸易洽谈会举办

9月8日至9月11日,为期4天的第二十三届中国国际投资贸易洽谈会在厦门顺利举办。 作为国内云原生安全领导厂商,安全狗凭借突出的安全综合实力,受委托并担任此次会议网络安保技术支撑单位。 厦门服云信息科技有限公司(品牌名&#xf…

第一章 JAVA入门

文章目录 1.2 Java 的特点1.2.1 简单1.2.2 面向对象1.2.3 与平台无关① 平台与机器指令② C/C程序依赖平台③ Java 虚拟机与字节码1.2.4 多线程1.2.5 动态1.30安装 JDK1.3.1 平台简介0 Java SE②Java EE1.4 Java 程序的开发步骤②保存源文件1.5.2 编译1.8 Java之父-James Gosli…

spring boot+redis整合基础入门

文章目录 前言准备依赖项配置文件redis模板类注入设置序列化方式 实施基础字符串操作、超时设置Hash操作hash的使用场景以及优缺点 列表操作列表操作的应用场景以及优缺点 Set的基础操作Set类型的业务场景以及优缺点Demo地址 总结 前言 最近项目中有用到redis进行一些数据的缓…

【Linux】编译器 gcc/g++

1、背景知识 (1)[LMYhecs-38755 ~]$ gcc code.c -o code.exe -stdc99【-o 生成指定名字的可执行文件,-stdc99 以 C99 的标准执行程序】 (2)安装 g,yum install gcc-c 2、gcc如何完成 (1&#x…

如何使用 Node.js和Express搭建服务器?

如何使用NodeJs搭建服务器 1. 准备工作1.1 安装Node.js 2. 安装express2.1 初始化package.json2.2 安装express2.3 Express 应用程序生成器 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段…

前端面试合集(三——浏览器)

浏览器的页面渲染 1.浏览器是如何渲染页面的?2. 什么是reflow(重排)?3. 什么是repaint(重绘)?4.为什么transform效率高? 1.浏览器是如何渲染页面的? 当浏览器的网络线程收到HTML文档之后&#…

Leetcode刷题_链表相关_c++版

&#xff08;1&#xff09;92反转链表–中等 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 /*** Definition for singly-linked list.* struct Lis…

Claude: ChatGPT替代大语言模型

【产品介绍】 Claude是Anthropic推出的类ChatGPT大语言模型&#xff0c;也是一个AI人工智能助理&#xff0c;可以帮助各种行业的用户处理工作&#xff0c;如客户服务、法律、教练、搜索和销售。Claude可以通过聊天界面和API进行访问&#xff0c;能够完成各种对话和文本处理任务…

计算机二级知识点整理

翻到了之前准备计算机二级的笔记&#xff0c;现在给大家分享出来。 一、基本知识&#xff1a; 计算机把完成一条指令所花费的时间称为一个指令周期结构化程序设计强调的是程序的易读性boolean类型不能转为其他基本类型数据表达式是由运算符和运算对象构成的&#xff0c;#不是…

SimpleCG程序交互操作

前言 之前所有示例程序都是属于展示型的&#xff0c;只是作为展示板输出使用&#xff0c;不涉及键盘和鼠标的输入交互&#xff0c;下面我们开始接触具有交互功能的程序。 没有交互功能的程序可以满足一定需求,不过大部分的程序是不能脱离交互功能的。程序依据使用者的操作进行相…

Error response from daemon

文章目录 遇到的问题解决方法参考 遇到的问题 当输入下面的指令时 docker pull xxxxxx解决方法 打开/etc/docker/daemon.json文件 vim /etc/docker/daemon.json写入以下内容&#xff1a; {"registry-mirrors":["https://docker.mirrors.ustc.edu.cn"]…

OpenCV 图像像素运算操作

加法操作详解 加减乘除 #include <opencv2/opencv.hpp>using namespace cv;int main() {Mat image imread("image.jpg");if (image.empty()) {std::cout << "无法加载图像" << std::endl;return -1;}// 加法变换Mat addResult;add(ima…

mac在vscode编码过程中输入()光标在里面的时候想移出来还得动用左右键很麻烦有什么快捷方法

下载vscode插件: 想跳出大括号的时候就可以使用tab直接跳出来就行了

Buuctf web [SUCTF 2019]EasySQL

又是一道考察sql注入的题 1、起手试探 &#xff08;主要看看输入什么内容有正确的回显&#xff09; 1 0 1 1 # 发现只有在输入1的情况下有正常的回显,输入0或其他字符都没有回显&#xff0c;所以这题就要尝试堆叠注入了。 ps&#xff1a;&#xff08;如果想尝试其他注入方法…

带你打穿三层内网-红日靶场七

文章目录 前记环境配置web1信息搜集cve-2021-3129redis未授权|ssh密钥后渗透 Win7&#xff08;PC1&#xff09;永恒之蓝 web2docker逃逸 win7&#xff08;PC2&#xff09;|DC 前记 所用工具 msfcsvenomfrp蚁剑冰蝎laravel.pyfscan 注意事项 msf的永恒之蓝每次都需要两次才能…

VM-Linux基础操作命令

命令执行的本质&#xff1a; 当输入命令&#xff08;单词&#xff09;后敲击回车的那一刻。它就会立刻到以下图片&#xff0c;变量中的文件中去找对应的可执行文件 此路径又叫环境变量 1.shell命令提示符 默认&#xff1a;[rootlocalhost ~]# root&#xff1a;现已登录的账户名…

重构优化第三方查询接口返回大数据量的分页问题

# 问题描述 用户线上查询其上网流量详单数据加载慢&#xff0c;且有时候数据没有响应全~ 1、经排除是调用第三方数据量达10w条响应会超时&#xff0c;数据没正常返回 2、现有线上缓存分页也是加载慢数据不能正常展示 3、第三方接口返回类似报文jsonj&#…