前言

Nginx服务器的配置对新手来说不算很友好,支持自定义的功能非常多,没有Apache2那么友好。

网上抄来的配置也不知道适不适合自己的服务器,因此,这边带大家来全面总结一下nginx服务器的一些相关配置。

内容

这些内容基本可以配置在 nginx.conf 的主程序配置文件的 server 框内,也可以选配在每个网站的配置文件中。

基础配置指令

1. send_timeout

send_timeout 用于设置 nginx 与客户端(浏览器等)之间发送数据的超时时间。如果在指定的时间内 nginx 没有向客户端发送数据,连接将被关闭。这个时间的单位是秒,默认值是 60s

在设置 send_timeout 时,应该根据实际情况选择合适的超时时间。如果超时时间设置得太短,可能会导致客户端接收不到完整的响应数据;如果超时时间设置得太长,可能会影响服务器的资源利用效率。

对于一个个人博客网站来说,一般来说设置 10ssend_timeout 应该是足够的,除非网站中包含大量的媒体文件或者其他大文件,需要较长的时间才能完成数据传输。如果出现超时问题,可以适当增加超时时间,或者考虑对网站的性能进行优化,减少数据传输时间。

2. reset_timedout_connection

reset_timedout_connection 用于控制是否在发送数据超时时重置连接。

reset_timedout_connection 被设置为 on 时,如果 nginx 发送数据的过程中发现超时,就会关闭连接并发送一个 RST 包(TCP reset)给客户端,客户端会认为这是一个异常中断,进而关闭连接。如果设置为 off ,则不会发送 RST 包,而是等待客户端自行关闭连接。

对于一个个人博客网站来说,如果希望在数据发送超时时及时释放服务器资源,可以考虑将 reset_timedout_connection 设置为 on 。不过需要注意,如果在传输数据的过程中,客户端已经接收到了部分数据,那么使用 reset_timedout_connection 会导致客户端无法获取完整的响应,这可能会对用户体验产生影响。

因此,在设置 reset_timedout_connection 时需要谨慎考虑,应该根据实际情况选择合适的配置。如果网站中包含大量的媒体文件或者其他大文件,可以考虑将 reset_timedout_connection 设置为 on,以便及时释放服务器资源。否则,建议将其设置为 off,以避免影响用户体验。

3. client_header_timeout

client_header_timeout 用于设置在接收到客户端请求头后,等待客户端发送请求体的最大时间。如果在指定时间内没有收到请求体,则 nginx 将返回 408 Request Timeout 错误。

该指令的默认值为 60s。在博客网站中,可以根据实际情况来调整这个值。如果博客网站的文章较大,或者访问量较大,可以适当增加 client_header_timeout 的值,以防止客户端发送请求体的时间过长导致超时错误。

但是需要注意,将 client_header_timeout 的值设置过高可能会增加服务器的负担,导致性能下降。

因此,建议在实际应用中进行性能测试,以找到最佳的配置方案。

4. client_header_buffer_size

client_header_buffer_size 用于控制 nginx 服务器接收请求头(header)的缓冲区大小。当客户端向 nginx 发送请求时,请求头可能会很大,如果 nginx 的缓冲区不够大,就会导致请求头被截断或者请求被丢弃。

可以通过在 http 或者 server 块中使用该指令来配置。

例如:

1
2
3
4
5
6
7
http {
client_header_buffer_size 1k;
}

server {
client_header_buffer_size 2k;
}

在上述示例中,http 块设置 client_header_buffer_size1kserver 块设置为 2k。如果没有在 http 块中设置该指令,则默认使用 nginx 的全局配置。一般来说,如果请求头较小,可以使用默认值,否则应该根据实际情况适当增大缓冲区大小。

如果是个人博客的话,建议将 client_header_timeoutclient_header_buffer_size 设置为以下值:

1
2
client_header_timeout 10s;
client_header_buffer_size 1k;

client_header_timeout 设置为 10 秒,是为了确保客户端在这个时间内发送完请求头,避免连接被超时关闭。而 client_header_buffer_size 设置为 1k,是为了防止缓冲区过大导致内存浪费,同时保证能够容纳大部分请求头信息。

5. client_body_timeout

client_body_timeout 指令用于设置等待客户端发送请求体的超时时间。如果在指定的时间内客户端没有发送请求体,那么服务器会关闭连接。

建议将 client_body_timeout 设置为 10 秒。这个时间可以根据自己的实际情况进行调整,如果上传文件比较大,可以适当增加这个时间。

示例配置:

1
client_body_timeout 10s;

在实际配置中,还需要根据自己的需求配置 client_max_body_sizeclient_body_buffer_size 等指令来限制客户端请求体的大小和缓冲区大小,以防止请求体过大导致服务器负载过高或内存不足。

6. client_body_buffer_size

client_body_buffer_size 指令用于设置 Nginx 接收客户端请求体的缓冲区大小。默认值为 8KB,当客户端请求体超过这个大小时,请求体会被写入磁盘临时文件,这会影响性能。

如果你的博客网站需要接收大量的请求体,可以考虑增加 client_body_buffer_size 的值来提高性能。但是,需要注意的是,过大的缓冲区可能会导致内存消耗过多,因此需要根据实际情况进行调整。

以下是一些建议的 client_body_buffer_size 值:

对于普通的博客网站,可以将值设置为 16KB32KB

对于需要接收大量请求体的网站,可以将值设置为 64KB 或更大。但需要注意,过大的缓冲区可能会导致内存消耗过多,需要根据实际情况进行调整。

需要注意的是,client_body_buffer_size 指令只是用于缓存请求体的,不会限制请求体的大小,因此还需要根据实际情况设置 client_max_body_size 指令来限制请求体的大小。

7. client_max_body_size

client_max_body_size 是一个nginx指令,用于限制客户端请求的最大请求体(body)大小。它用于保护web服务器免受恶意大型请求体的攻击,如DoS(拒绝服务)攻击和文件上传攻击等。

默认情况下,Nginx设置 client_max_body_size1M 。如果客户端发送一个比这个更大的请求体,Nginx将返回一个错误码413,表示请求体太大。可以使用这个指令来限制客户端请求体的大小。

例如,如果要将最大请求体大小设置为100M,可以将以下指令添加到nginx配置中:

1
client_max_body_size 100M;  //如果需要上传大型文件,可以调高

请注意,这个指令必须在 httpserverlocation 块中进行设置,并且只能在 http 块中进行全局设置。在每个server或location块中都可以单独设置它,以覆盖全局设置。

SSL模块

1. ssl_prefer_server_ciphers

ssl_prefer_server_ciphers 是 Nginx SSL 模块中的一个指令,用于设置是否优先使用服务器端配置的加密套件。如果设置为 on ,Nginx 会使用服务器端所支持的加密套件中最符合客户端请求的套件。如果设置为 off ,则使用客户端请求的加密套件中最符合服务器端的套件。

如果您需要确保服务器端加密套件的优先级高于客户端加密套件,可以将 ssl_prefer_server_ciphers 指令设置为 on。这样可以确保服务器端的加密套件更安全,并且避免一些不安全的加密套件被客户端所使用。

然而,对于现代浏览器而言,客户端所支持的加密套件已经非常安全,因此如果您使用较新的 SSL/TLS 协议版本(如 TLS 1.3),那么将 ssl_prefer_server_ciphers 设置为 off 可能会更好,因为这可以让客户端请求的加密套件更符合服务器端的加密套件,从而提高连接的安全性和稳定性。

但是,如果您使用的是较旧的 SSL/TLS 协议版本,或者需要确保服务器端加密套件的安全性更高,那么将 ssl_prefer_server_ciphers 设置为 on 可能会更为适合。

2. ssl_session_timeout

ssl_session_timeout 是 Nginx SSL 模块的一个指令,用于设置 SSL 会话的超时时间。SSL 会话是在客户端和服务器端建立连接时创建的,用于加密和解密数据通信的安全会话。

通常情况下,SSL 会话会被缓存起来以提高性能,并且可以在客户端和服务器端之间的多次请求中被重用。

ssl_session_timeout 指令设置缓存的超时时间,当 SSL 会话超过这个时间后,就会被清除,这样可以确保缓存的 SSL 会话不会太久而导致安全风险。

建议将 ssl_session_timeout 设置为较短的时间,以确保会话可以在较短的时间内得到更新。通常情况下,可以将其设置为 5 分钟左右,但具体的设置时间应根据您的应用需求和服务器资源来确定。如果您的应用需要频繁地建立 SSL 连接,那么可以将其设置得更短,以确保 SSL 会话的及时更新。如果您的应用需要长时间保持 SSL 连接,那么可以将其设置得更长,以减少会话重新创建的次数,从而提高性能。

对于一个博客网站,建议将 ssl_session_timeout 设置为 5 分钟左右,这样可以保证 SSL 会话可以在较短的时间内得到更新,从而减少会话重新创建的次数,提高性能。

如果博客网站需要频繁地建立 SSL 连接,那么可以将其设置得更短,例如设置为 2 分钟或更短。但如果您的博客网站需要长时间保持 SSL 连接,例如需要进行实时数据交换或在线聊天等操作,那么可以将其设置得更长,例如设置为 10 分钟或更长,以减少会话重新创建的次数,提高性能。

3. ssl_ecdh_curve

ssl_ecdh_curve 是一个 SSL/TLS 配置指令,用于指定使用的椭圆曲线加密算法。

可以配置的值有:secp384r1secp521r1x25519 等等。

比如配置为 ssl_ecdh_curve secp384r1;, 在这个指令中,secp384r1 表示使用 P-384 椭圆曲线 来进行密钥交换,这是一种安全性较高的椭圆曲线加密算法。

建议在 SSL/TLS 配置中使用 ssl_ecdh_curve 指令,以确保使用的加密算法足够安全。如果使用的是较新的版本的 OpenSSL 库,则可以使用更安全的椭圆曲线,例如 secp521r1x25519 。但需要注意的是,选择更安全的加密算法会增加 CPU 负载,因此可能会影响服务器的性能。如果您的服务器资源较为有限,可以选择适当的椭圆曲线加密算法,以在安全性和性能之间取得平衡。

如果不设置 ssl_ecdh_curve 指令,则 OpenSSL 库将使用默认的椭圆曲线参数,这可能会导致使用较弱的加密算法进行密钥交换,从而降低 SSL/TLS 的安全性。因此,建议在 SSL/TLS 配置中设置 ssl_ecdh_curve 指令,以确保使用足够安全的加密算法来保护您的网站和用户数据。

secp521r1x25519 的区别:

secp521r1x25519 都是椭圆曲线算法,用于实现基于椭圆曲线加密的 Diffie-Hellman 密钥交换协议(ECDHE)。两者的区别在于所采用的椭圆曲线不同。

secp521r1 使用的是 521 位的椭圆曲线,这种曲线的安全性比较高,但需要更多的计算资源。

x25519 使用的是基于 255 位的 Montgomery 曲线,这种曲线的安全性和计算效率都比较高,但与 secp521r1 相比,可能存在更少的安全性保证。

从性能和安全性方面考虑,建议优先选择 x25519 曲线。但是需要注意的是,不同的 SSL/TLS 库或客户端可能支持的椭圆曲线不同,因此需要根据具体的情况进行选择。

4. ssl_session_cache

ssl_session_cache 指令用于设置SSL会话缓存。SSL会话缓存可以存储SSL/TLS连接的参数,包括服务器证书、客户端证书、协商的密码以及其他参数。当客户端重新连接到同一个服务器时,可以重用之前存储的参数,从而减少SSL握手的开销。

例如,可以使用以下指令开启SSL会话缓存:

1
ssl_session_cache shared:SSL:50m;

该指令将启用一个名为“SSL”的缓存区,大小为50兆字节。缓存区是共享的,可以被多个工作进程共享。在缓存中,SSL会话将被存储5分钟,之后将被自动清除。

需要注意的是,开启SSL会话缓存会增加服务器的内存开销,因此需要根据服务器的配置和负载情况来合理设置缓存大小和存储时间。

5. ssl_session_tickets

ssl_session_tickets 指令用于启用或禁用 SSL/TLS 会话票据。会话票据是一种可选的机制,它使得客户端可以将 SSL/TLS 会话数据存储在本地,以便于在不同的连接之间进行重用。这种机制可以降低握手延迟和服务器负载,但可能会对安全性造成一定的影响。

ssl_session_tickets 被设置为 on 时,Nginx 将启用 SSL/TLS 会话票据机制。反之,当它被设置为 off 时,会话票据机制将被禁用。

在启用会话票据时,可以使用 ssl_session_ticket_key 指令来生成票据密钥。例如:

1
2
ssl_session_tickets on;
ssl_session_ticket_key /path/to/ticket.key;

这将启用会话票据,并使用 /path/to/ticket.key 文件中的密钥来加密和解密票据。

6. ssl_stapling

SSL stapling 是一种安全机制,它允许Web服务器验证SSL证书并向客户端发送签名证明(即TLS证书验证扩展)。这样可以提高安全性和性能,减少服务器的负载。

在Nginx中,可以使用 ssl_stapling on 开启 SSL stapling ,表示启用 OCSP响应(Online Certificate Status Protocol)

示例配置:

1
2
3
4
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/nginx/ssl/trusted.crt;
resolver 8.8.8.8 8.8.4.4 valid=300s;
  • ssl_stapling on: 启用SSL stapling。

  • ssl_stapling_verify on: 启用OCSP响应的验证。

  • ssl_trusted_certificate: 指定可信证书的路径。

  • resolver: 指定DNS解析器的地址。

使用 SSL stapling 可以提高SSL证书的安全性和可靠性,减少中间人攻击的风险。

open_file_cache

open_file_cache

open_file_cache 指令用于开启文件缓存,提高访问频率较高的文件的读取速度,从而提高服务器的性能。具体来说,open_file_cache 指令会将一些常用文件信息缓存到内存中,以避免频繁地从硬盘中读取,从而加快文件的读取速度。

示例:

1
open_file_cache max=204800 inactive=20s;

该指令有多个参数,其中 max 参数指定了缓存中最多可以存放多少个文件描述符,inactive 参数指定了文件的访问时间超过多少秒后会被从缓存中移除。

需要注意的是,开启文件缓存会消耗服务器的内存,因此需要根据服务器的配置和使用情况合理地配置缓存大小和超时时间。

通常情况下,建议将 max 参数设置为 204800 左右,inactive 参数设置为 10-20 秒。具体配置需要根据实际情况而定。

open_file_cache 和缓存还是有些区别的,虽然它们都可以提高服务器响应速度,但是它们的工作方式不同。

open_file_cache 主要是用于减少服务器对于磁盘的访问,通过将磁盘中的文件信息缓存到内存中,以减少后续对于同一文件的访问时需要再次访问磁盘的次数,从而提高服务器响应速度。

而缓存则是将一些经常被请求的数据暂存在内存中,以避免每次请求都需要重新计算或重新获取数据,从而提高服务器响应速度。

因此,这两种机制虽然都可以提高服务器性能,但是它们的应用场景和作用略有不同。

FastCGI模块

1. fastcgi_buffers

fastcgi_buffers 是用于配置Nginx与FastCGI服务通信时的缓存区大小的指令。

在将请求转发到FastCGI进程时,Nginx会将请求的内容写入缓存区,然后将该缓存区的内容传递给FastCGI进程进行处理。

fastcgi_buffers指令用于设置缓存区的数量和大小。这个指令通常用于调整Nginx与FastCGI之间的通信性能,以优化服务器的响应速度和吞吐量。

fastcgi_buffers的格式如下:

1
fastcgi_buffers <number> <size>;

其中,<number> 指定缓存区的数量,<size> 指定每个缓存区的大小。可以使用K(千字节)或M(兆字节)等单位来指定缓存区的大小。

例如,以下指令将设置每个缓存区的大小为16K,并创建8个缓存区:

1
fastcgi_buffers 8 16k;

需要注意的是,如果FastCGI进程的响应超过了Nginx的缓存区大小,可能会导致部分响应被截断。

因此,根据应用程序的需求和服务器的负载情况,需要适当调整缓存区的数量和大小,以获得最佳的性能和稳定性。

对于 fastcgi_buffers 的最佳设置取决于您网站的具体情况。通常情况下,您可以将其设置为:

1
2
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;

这将设置每个 worker 进程分配的 16 个缓冲区,每个缓冲区大小为 16k。另外,fastcgi_buffer_size 设置单个缓冲区的最大值为 32k

但是,如果您的网站处理大量的表单数据、文件上传等,可以根据需要增加缓冲区大小以提高性能。

值得注意的是,fastcgi_buffers 设置的值过小可能导致请求被切分成多个小块,增加服务器的负担。如果值过大,则可能占用过多的内存。

2. fastcgi_connect_timeout

fastcgi_connect_timeout 用于设置 Nginx 与 FastCGI 服务器建立连接的超时时间,即 FastCGI 服务器响应的时间。如果 FastCGI 服务器没有在规定的时间内响应,那么连接将被视为超时。

这个超时时间的设定需要根据具体情况进行调整,如果设定过短,可能会出现 FastCGI 服务器无法响应的情况;如果设定过长,则可能会导致客户端请求长时间处于等待状态。

一般来说,建议将 fastcgi_connect_timeout 设为几秒钟到十秒钟之间。根据服务器的负载和网络状况,需要不断地进行调整,以达到最佳的效果。

3. fastcgi_send_timeout

fastcgi_send_timeout 用于设置发送请求到FastCGI进程的超时时间。如果在指定的时间内没有完成请求发送,则连接将被关闭。这个超时时间包括在发送文件时可能遇到的延迟。

在一个高流量的网站中,将 fastcgi_send_timeout 设置得太短可能会导致请求失败,特别是在上传大型文件时。但是,将其设置得太长也会增加连接的生命周期,从而降低服务器的可用性。

一般来说,fastcgi_send_timeout 的值应该根据网站的实际情况进行调整。如果上传大型文件的频率较高,则可以将其设置为更长的时间。如果文件大小较小,则可以将其设置为较短的时间,以避免过长的连接时间。通常情况下,可以将其设置为30秒左右。

例如:

1
fastcgi_send_timeout 30s;

4. fastcgi_read_timeout

fastcgi_read_timeout 是用于控制读取响应数据的超时时间,即等待FastCGI服务器响应的时间。如果超时,Nginx会关闭与FastCGI服务器的连接并向客户端发送错误响应。它的默认值是 60秒 ,可以根据实际情况进行调整。

在博客网站中,这个值可以根据后端FastCGI服务器的响应速度和网站访问量来进行调整。如果FastCGI服务器响应速度较慢,可以适当增加该值。

5. fastcgi_busy_buffers_size

fastcgi_busy_buffers_size 是用于配置 Nginx FastCGI 进程在处理响应时,如果处理完某个请求后,等待下一个请求到达的时间。它决定了处理请求的进程需要保留多少内存用于缓冲区,以保证在下一个请求到达时能够立即响应,从而加快服务器的响应速度。

这个指令一般用于高并发环境,用于设置 FastCGI 进程保留的内存大小。如果设置的值过小,当并发请求较多时,FastCGI 进程会频繁地分配和释放内存,造成较大的系统开销,影响服务器的响应速度。如果设置的值过大,将导致服务器消耗更多的内存,影响服务器的性能。

一般情况下,可以根据服务器的物理内存大小和并发请求的数量来进行设置。对于一个典型的博客网站,建议设置为 16k64k

6. fastcgi_temp_file_write_size

fastcgi_temp_file_write_size 是指当 FastCGI 应用程序需要写入比内存缓冲区更大的响应内容时,Nginx 要将内容写入到磁盘上的临时文件,这个指令设置的是写入到临时文件的最大字节数。如果应用程序发送的响应比缓冲区大得多,则需要分配临时文件,并使用 fastcgi_temp_path 指令指定临时文件的路径。在调整这个指令时需要考虑到系统的磁盘性能和磁盘使用情况。

建议根据实际情况进行调整,如果服务器磁盘性能好,且有足够的可用磁盘空间,可以设置为较大的值,比如 64k128k。如果磁盘性能差,可以将值设置为较小的值,比如 4k8k

7. fastcgi_cache_path

示例配置:

1
fastcgi_cache_path /path/to/folder levels=1:2 keys_zone=server_one:128m max_size=1g inactive=60m;

这个指令是用来配置FastCGI缓存的路径和参数,具体解释如下:

  • fastcgi_cache_path: 设置FastCGI缓存的路径。在上面的示例中,FastCGI缓存路径是/path/to/folder。

  • levels: 指定缓存目录结构的层数。在上面的示例中,levels=1:2表示缓存目录结构为两层,第一层目录名由第一个字符组成,第二层目录名由接下来的两个字符组成。

  • keys_zone: 定义缓存区域的名称和大小。在上面的示例中,缓存区域的名称是server_one,大小为128m。

  • max_size: 指定缓存区域的最大大小。在上面的示例中,缓存区域的最大大小为1g。

  • inactive: 指定缓存条目的空闲时间。在上面的示例中,缓存条目在60m内没有被访问就会被认为是过期的。

需要注意的是,上述配置是基于FastCGI的缓存。如果你的网站使用的是PHP-FPM作为后端,那么这个配置是可以生效的。如果使用的是其他类型的后端,需要相应地进行修改。

FastCGI 缓存可以将经常访问的网页存储在内存或磁盘中,以加快网站的响应速度。

但是,对于动态或经常更新的内容,FastCGI 缓存可能会导致缓存不一致,从而在网站上显示错误的内容。因此,在为比如类似 WordPress 这种动态类型的网站使用 FastCGI 缓存时,需要在配置文件中指定清除缓存的规则,以确保缓存内容始终是最新的。

方法:

  1. 可以通过配置nginx的缓存管理器来定时清理FastCGI缓存。可以使用如下命令清理FastCGI缓存:

    1
    sudo rm -rf /path/to/folder/*
  2. 将此命令添加到 crontab 中,定期执行清理操作。例如,将清理操作每天晚上12点执行,可以在命令行中运行:

    1
    sudo crontab -e
  3. 然后在crontab文件中添加以下行:

    1
    0 0 * * * /usr/bin/sudo /bin/rm -rf /path/to/folder/*

8. fastcgi_cache_key

fastcgi_cache_key 指令用于设置缓存的键值,缓存键值应该是一个唯一的标识符,用于标识被缓存的响应,以便于将来的查询可以从缓存中读取响应。

在 Nginx 的 fastcgi_cache_key 中,可以使用 $scheme$host$request_method$request_uri$query_string$http_ 等变量。

其中,$scheme 表示当前请求的协议,$host 表示当前请求的主机名,$request_method 表示当前请求的方法(GET、POST 等),$request_uri 表示当前请求的 URI,$query_string 表示当前请求的查询参数,$http_ 后面跟的是任意请求头。

以下是一个例子:

1
fastcgi_cache_key "$scheme$request_method$host$request_uri";

在这个例子中,缓存键值由请求的协议、请求方法、主机名和 URI 组成。这样,只要有任何一个值不同,缓存键值就会改变,从而避免了不同的请求使用相同的缓存。

9. fastcgi_cache_valid

fastcgi_cache_valid 指令用于指定响应应该缓存多长时间。其语法为:

1
fastcgi_cache_valid [code ...] time;

其中,code 表示 HTTP 响应状态码,例如 200、301、404 等。如果没有指定状态码,则适用于所有状态码。time 表示缓存的时间,可以使用各种时间单位,例如 s 表示秒,m 表示分,h 表示小时,d 表示天,w 表示周等。

例如,以下指令表示将 200 和 301 状态码的响应缓存 1 小时:

1
fastcgi_cache_valid 200 301 1h;

如果一个请求匹配多个 fastcgi_cache_valid 指令,则缓存的时间以最长的那个为准。

另外,fastcgi_cache_valid 还可以接受一个额外的参数,称为“层次结构”。层次结构是用于指定不同的缓存时间的级别,例如:

1
2
3
4
fastcgi_cache_valid 200 60m;
fastcgi_cache_valid 404 1m;
fastcgi_cache_valid 500 0;
fastcgi_cache_valid any 10m;

这里定义了三个级别:60m 表示主要级别,即对于状态码为 200 的响应,缓存时间为 60 分钟;1m 表示次要级别,即对于状态码为 404 的响应,缓存时间为 1 分钟;0 表示无缓存;any 表示默认级别,即对于其他状态码的响应,缓存时间为 10 分钟。

在使用层次结构时,只要指定了较高的级别,就不需要再指定较低的级别。例如,如果已经定义了一个主要级别的缓存时间,那么对于相同的状态码,次要级别的缓存时间将被忽略。

比如在 WordPress 中,fastcgi_cache_valid 可以结合 fastcgi_cache_key 使用,来控制缓存时间。

例如,以下配置指定了对于 URL 中包含 /blog/ 的请求,缓存时间为 1 小时

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_valid 200 1h;
fastcgi_cache_bypass $http_pragma;
fastcgi_cache_revalidate on;
fastcgi_cache_min_uses 1;
fastcgi_cache_use_stale error timeout invalid_header http_500;
if ($request_uri ~ /blog/) {
set $no_cache 0;
}
if ($no_cache) {
add_header Cache-Control "no-cache, no-store, max-age=0, must-revalidate";
expires off;
fastcgi_cache_bypass $http_pragma;
fastcgi_cache_revalidate off;
}

在这个例子中,fastcgi_cache_key 指令用于定义缓存的键值,fastcgi_cache_valid 指令则用于定义缓存的有效期。具体来说,fastcgi_cache_valid 指令可以使用两个参数来设置缓存的有效期,第一个参数是缓存状态码,第二个参数是缓存时间,例如:

1
2
fastcgi_cache_valid 200 60m;
fastcgi_cache_valid 404 1m;

上面的配置表示缓存200状态码的响应60分钟,缓存404状态码的响应1分钟。可以根据具体的需求来配置 fastcgi_cache_valid 指令。

10. fastcgi_cache_min_uses

fastcgi_cache_min_uses 指令用于设置最少的请求数,也就是说,只有在客户端请求超过指定次数之后,nginx才会将该请求缓存下来。这个指令可以避免低频请求被缓存,提高缓存的效率。当缓存的请求数不足最小请求数时,nginx会直接将请求转发给后端服务器。默认值为1

11. fastcgi_cache_use_stale

fastcgi_cache_use_stale 指令定义了在后端服务器不可用或者后端服务器在响应过程中出现错误时,是否使用缓存的内容。

示例:

1
fastcgi_cache_use_stale error timeout invalid_header http_500; 

参数 error 表示当后端服务器返回状态码为500、502、503、504时,可以使用缓存的内容;

参数 timeout 表示当后端服务器超时时,可以使用缓存的内容;

参数 invalid_header 表示当后端服务器返回的响应头格式不正确时,可以使用缓存的内容;

参数 http_500 表示当后端服务器返回状态码为500时,可以使用缓存的内容。

可以在参数中任意组合使用多个值,以空格分隔。如果未定义,则默认不使用缓存的内容。

resolver指令

这个指令是用来配置Nginx的DNS解析器,它定义了一个IP地址列表,Nginx会将这个列表用于解析upstream主机名。

示例:

1
resolver 8.8.8.8 8.8.4.4 valid=300s;

在这个例子中,resolver指令将会使用Google Public DNS的IP地址 8.8.8.88.8.4.4 作为解析器,并将DNS解析器的有效期设置为300秒,也就是5分钟。

当Nginx需要解析一个域名时,它会先检查缓存中是否已经有解析过的结果,如果缓存中没有,就会向指定的DNS解析器发起请求。如果DNS解析器返回了多个IP地址,Nginx会按照顺序逐一尝试这些地址,直到成功建立连接或者全部失败。如果某个IP地址在建立连接时失败了,Nginx会自动切换到下一个IP地址,直到成功建立连接或者全部失败。

使用resolver指令可以提高upstream主机名的解析成功率和可靠性,同时也可以减少DNS解析带来的延迟。

适用环境:

resolver 指令用于配置 Nginx 在解析主机名时使用的 DNS 服务器,一般用于反向代理或者负载均衡场景下。具体而言,当 Nginx 需要连接后端服务器的时候,它可能需要先通过 DNS 查询获取服务器的 IP 地址。使用 resolver 指令可以指定 DNS 服务器的地址,有效避免 DNS 解析出现故障或延迟的问题。

在反向代理或负载均衡环境中,使用 resolver 指令可以确保 Nginx 总是使用最新的 IP 地址连接后端服务器,从而保证连接的稳定性和可靠性。通常情况下,建议将 resolver 指令配置在全局配置中,或者针对反向代理或负载均衡的上游服务器设置。

需要注意的是,resolver 指令指定的 DNS 服务器可能存在故障或延迟,为了避免这些问题影响 Nginx 的性能,可以通过在 resolver 后面添加 valid 参数来指定 DNS 解析结果的有效期,超过有效期后会重新查询 DNS 服务器。例如 resolver 8.8.8.8 valid=300s; 表示将 DNS 解析结果缓存 300 秒,过期后重新查询 DNS 服务器。

Proxy模块

这个整体可以参照FastCGI模块来设置,根据自己情况进行微调。

不多赘述。

哈希类

1. types_hash_max_size

types_hash_max_size 是一个指令,用于设置 Nginx 内部类型哈希表的最大数量。该指令的默认值为 2048,可以根据需要进行调整。

当Nginx 需要处理大量的文件类型时,types_hash_max_size 可以帮助 Nginx 更快地查找文件类型,从而提高性能。但是,如果该值设置得太大,可能会浪费过多内存。因此,应该根据实际需求和服务器的硬件资源进行调整。

types_hash_max_size 指令用于设置 MIME 类型的哈希表的最大大小,它会影响在 Nginx 中查找 MIME 类型的速度。

对于大多数网站来说,设置 types_hash_max_size20484096 就足够了。如果网站包含大量的文件类型,可以适当增加这个值。

需要注意的是,types_hash_max_size 的值必须是 2 的幂。

2. variables_hash_max_size

variables_hash_max_size 是用于定义变量哈希表的最大大小的 Nginx 指令。该哈希表用于存储 Nginx 变量的名称和值。

在 Nginx 的配置中,变量是由 $ 符号后跟变量名称构成的,例如 $host 表示请求的主机名。Nginx 使用变量来获取有关客户端请求的信息,并将其用于配置中的其他指令。

variables_hash_max_size 可以控制 Nginx 哈希表中存储的变量名称和值的最大数量。默认值为 1024

对于一个典型的个人博客网站,将 variables_hash_max_size 设置为默认值应该是足够的。但是,如果您的配置文件使用了大量变量,例如在多个 if 块中使用变量,那么您可能需要增加此值以避免哈希表溢出。

通常情况下,将 variables_hash_max_size 设置为 2048更高的值 应该是足够的。

3. variables_hash_bucket_size

variables_hash_bucket_size 指令用于设置变量哈希表中每个桶的大小,它决定了变量名和值的映射方式。在处理请求时,Nginx需要对变量名和值进行哈希计算以便查找变量值,因此设置适当的 variables_hash_bucket_size 可以提高查找效率。

一般建议将 variables_hash_bucket_size 设置为 Nginx 可用内存的 1/81/4,具体取决于服务器硬件配置和业务负载。默认值是 64,如果在日志中出现类似 could not build variables_hash, you should increase variables_hash_max_size 的错误,就需要调整该值。

例如,如果服务器总内存为 4GB,可以将 variables_hash_bucket_size 设置为 5121024

GZIP模块

1. gzip_buffers

gzip_buffers 指令指定压缩时使用的缓冲区数量和大小。它的语法如下:

1
gzip_buffers number size;

其中,number 表示缓冲区数量,size 表示缓冲区大小。缓冲区大小应该是一个合适的内存页大小(通常是 4K8K),以便最大限度地利用内存,减少内存碎片。

在使用 gzip 压缩响应时,gzip_buffers 指令可以显著提高性能,因为它可以减少 I/O 操作,从而提高响应速度。建议根据服务器的内存大小和负载情况进行调整,以充分利用内存并确保不会出现内存不足的情况。

常见的设置包括:

1
2
3
gzip_buffers 16 8k;
gzip_buffers 32 4k;
gzip_buffers 64 4k;

常用GZIP设置推荐:

1
2
3
4
5
6
7
8
gzip on;
gzip_vary on;
gzip_comp_level 6;
gzip_min_length 1000;
gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml;
gzip_disable "MSIE [1-6]\.";
gzip_proxied any;
gzip_buffers 16 8k;

2. gzip_disable

gzip_disable 是一个用于禁用gzip压缩的指令,可以用于禁用一些不支持gzip的浏览器,以及一些代理服务器等。

例如,gzip_disable "MSIE [1-6]\."; 的作用是禁用IE6及以下版本浏览器的gzip压缩。这是因为在过去,IE6及以下版本的浏览器对gzip的支持并不完整,可能会出现一些兼容性问题。

如果你的网站的访问者中没有使用IE6及以下版本的浏览器,那么可以考虑将该指令加入nginx配置文件中以提高网站性能。

3. gzip_proxied

gzip_proxied 是一个用于指定在什么情况下使用Gzip压缩的Nginx配置指令。

gzip_proxied 有以下可选参数:

  • off - 禁用gzip压缩

  • expired - 仅在响应头中包含“Expires”或“Cache-Control”字段的响应中启用gzip压缩

  • no-cache - 仅在响应头中包含“Set-Cookie”或“Cache-Control”字段的响应中启用gzip压缩

  • no-store - 仅在响应头中包含“Set-Cookie”或“Cache-Control”字段的响应中启用gzip压缩

  • private - 仅在响应头中包含“Set-Cookie”或“Cache-Control”字段的响应中启用gzip压缩

  • no_last_modified - 在请求头中没有If-Modified-Since字段的情况下启用gzip压缩

  • no_etag - 在请求头中没有If-None-Match字段的情况下启用gzip压缩

  • auth - 在请求头中包含Authorization字段的情况下启用gzip压缩

  • any - 在任何情况下都启用gzip压缩

对于一个个人博客网站,可以考虑将 gzip_proxied 指令设置为 any 以在任何情况下都启用gzip压缩。这将有助于减少传输内容的大小,提高网站的加载速度和性能。

4. gzip_http_version

gzip_http_version 指令用于指定Gzip模块发送压缩响应时使用的HTTP协议版本。它可以设置为1.01.1。如果设置为1.0,则只使用HTTP/1.0协议。如果设置为1.1,则使用HTTP/1.1协议更高版本(例如HTTP/2)。默认情况下,gzip_http_version设置为1.1

最后

像一些 worker_processesworker_rlimit_nofileevents 模块等网上一搜一大把,基本都是一样的,也没必要自己再做更改。

主要还是各个模块一些 buffer time size 等等的值需要好好研究,根据自己的服务器进行优化。

最后附一个详细点的配置供参考:

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
user www-data;
worker_processes 8; //CPU核心数
worker_cpu_affinity auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
worker_rlimit_nofile 65535;

events {
use epoll; //处理模型
worker_connections 65535;
multi_accept on;
}


http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 60;
server_tokens off;
send_timeout 30;

client_header_timeout 60s;
client_header_buffer_size 1k;
client_max_body_size 4096M;
client_body_timeout 120s;
client_body_buffer_size 64k;

################## fastcgi相关设置

fastcgi_buffers 32 64K;
fastcgi_buffer_size 32k;
fastcgi_connect_timeout 600;
fastcgi_send_timeout 600;
fastcgi_read_timeout 600;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 256k;


################## proxy相关设置

proxy_buffers 32 64K;
proxy_buffer_size 32k;
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 256k;


################## 缓存

fastcgi_cache_path /path/to/folder levels=1:2 keys_zone=yydnas.com:128m max_size=1g inactive=60m;
fastcgi_cache_path /path/to/folder levels=1:2 keys_zone=luxiyue.com:256m max_size=1g inactive=1d;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_valid 200 302 1h;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 10m;
fastcgi_cache_min_uses 1;
fastcgi_cache_use_stale error timeout invalid_header http_500;

proxy_cache_path /path/to/folder levels=1:2 keys_zone=yydnas.com:64m max_size=1g inactive=30d;
proxy_cache_path /path/to/folder levels=1:2 keys_zone=luxiyue.com:64m max_size=1g inactive=30d;
proxy_cache_key $scheme$proxy_host$uri$is_args$args;
proxy_cache_valid 200 302 1h;
proxy_cache_valid 301 1d;
proxy_cache_valid any 10m;
proxy_cache_min_uses 5;
proxy_cache_methods GET HEAD POST;

################## 文件缓存

open_file_cache max=204800 inactive=20s;
open_file_cache_min_uses 5;
open_file_cache_valid 30s;


################## SSL配置

ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH;
ssl_prefer_server_ciphers off;
ssl_ecdh_curve x25519;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_session_timeout 10m;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;

################## 哈希表

types_hash_max_size 4096;
variables_hash_max_size 2048;
variables_hash_bucket_size 2048;


################## 响应头策略

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "no-referrer" always;
add_header X-Download-Options "noopen" always;
add_header X-Permitted-Cross-Domain-Policies "none" always;
add_header X-Robots-Tag "none" always;
add_header Cache-Control no-cache;


################## 包含文件夹

include /etc/nginx/sites-enabled/*;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/mime.types;
default_type application/octet-stream;


################## LOG模块

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;


################## GZIP模块

gzip on;
gzip_vary on;
gzip_comp_level 6;
gzip_min_length 2k;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_proxied any;
gzip_disable "MSIE [1-6]\.";
gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml;


################## 自定义设置,禁止盗链或者禁止IP访问等,根据实际需求调整

server {
listen 80;
return 500;
}

server {
listen 443 ssl http2;

ssl_certificate /etc/nginx/certs/luxiyue/www/luxiyue.com_bundle.pem;
ssl_certificate_key /etc/nginx/certs/luxiyue/www/luxiyue.com.key;

if ( !-e $request_filename ) {
rewrite ^/(.*)$ https://www.luxiyue.com/ ;
}
}
}