深入解析Nginx配置文件

​ Nginx是一款高性能的HTTP和反向代理服务器,广泛应用于各类Web服务器。作为一名Java后端开发工程师,了解Nginx配置文件的细节是非常有必要的。之前工作中遇到的问题,都是一加一改就了事了,从来没有真正仔细研究过,那么本篇文章就深入解析Nginx配置文件。

一、Nginx配置文件的基本结构

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
user www-data;
worker_processes auto;
pid /run/nginx.pid;

events {
worker_connections 768;
# multi_accept on;
}

http {

sendfile on;
tcp_nopush on;
types_hash_max_size 2048;

include /etc/nginx/mime.types;
default_type application/octet-stream;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;

access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;

gzip on;

include /etc/nginx/conf.d/*.conf;
}

主要分成四部分:

1.main(全局设置)main部分设置的指令将影响其它所有部分的设置;

2.server(主机设置)server部分的指令主要用于指定虚拟主机域名、IP和端口;

3.upstream(反向代理、负载均衡相关配置)upstream的指令用于设置一系列的后端服务器,设置反向代理及后端服务器的负载均衡

4. location(URL匹配特定位置后的设置)location部分用于匹配网页位置(比如,根目录“/”,“/images”,等等)。

每部分包含若干个指令。

他们之间的关系式:server继承main,location继承server;upstream既不会继承指令也不会被继承。它有自己的特殊指令,不需要在其他地方的应用。

二、配置项详解

1.全局指令

  • user: 指定Nginx进程的运行用户。默认值通常为nginx
  • worker_processes: 指定Nginx的工作进程数。根据服务器的CPU核心数进行设置可以提升性能。
  • error_log: 定义错误日志文件的位置和日志级别。日志级别包括debuginfonoticewarnerrorcrit等。
  • pid: 指定存放Nginx进程ID文件的位置。

2.事件模块

1
2
3
4
events {
worker_connections 768;
# multi_accept on;
}
  • worker_connections: 每个工作进程可以同时处理的最大连接数。与worker_processes一起决定了Nginx的并发处理能力。

3.HTTP模块

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
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
types_hash_max_size 2048;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;

##
# SSL Settings
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;

##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;

##
# Gzip Settings
##
gzip on;
# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
}
  • include: 包含其他配置文件。/etc/nginx/mime.types定义了MIME类型,/etc/nginx/conf.d/*.conf包含了其他子配置文件。
  • default_type: 设置默认的MIME类型。
  • log_format: 定义日志格式。
  • access_log: 定义访问日志文件的位置和使用的日志格式。
  • sendfile: 启用高效的文件传输模式。默认开启。
  • keepalive_timeout: 定义客户端连接保持活动的时间。
  • gzip on:开启gzip压缩输出

三、Server模块

http模块中的server块定义了虚拟主机配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
server {
listen 80;
server_name localhost;

location / {
root /usr/share/nginx/html;
index index.html index.htm;
}

error_page 404 /404.html;
location = /404.html {
internal;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
internal;
}
}
  • listen: 定义服务器监听的端口。
  • server_name: 定义虚拟主机名。
  • location: 用于匹配URI,定义请求的处理方式。
  • root: 设置请求的根目录。
  • index: 定义默认的索引文件。
  • error_page: 指定错误页面。当发生404错误时,跳转到/404.html

四、Location指令

location指令用于匹配请求URI,可以根据不同的匹配规则来处理请求。

匹配优先级:精确匹配 > 正则匹配 > 前缀匹配。

  • 精确匹配:
1
2
3
4
5
6
7
8
9
10
11
# 错误页面
error_page 404 /404.html;
location = /404.html {
internal;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
internal;
}

  • 前缀匹配:
1
2
3
location /images/ {
# 前缀匹配
}
  • 正则匹配:
1
2
3
4
5
6
7
# 静态文件缓存优化
location ~* \.(jpg|jpeg|png|gif|ico|css|js|webp|svg|woff|woff2|ttf|eot)$ {
expires 30d;
access_log off;
add_header Cache-Control "public, no-transform";
}

五、反向代理配置

反向代理是Nginx常用的功能之一,通过配置Nginx作为反向代理服务器,可以实现负载均衡、缓存、SSL终止等功能。

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
#对 "/" 启用反向代理 
location / {
proxy_pass http://127.0.0.1:88;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;

#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

#以下是一些反向代理的配置。

proxy_set_header Host $host;
client_max_body_size 10m; #允许客户端请求的最大单文件字节数

client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数,

proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时)

proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时)

proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)

proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小

proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的设置

proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)

proxy_temp_file_write_size 64k;
#设定缓存文件夹大小,大于这个值,将从upstream服务器传
}
  • proxy_pass: 指定后端服务器的地址。
  • proxy_set_header: 设置请求头信息,传递客户端的真实IP地址等信息。

六、负载均衡配置

Nginx支持多种负载均衡策略,包括轮询、IP哈希、最少连接等。

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

server {
listen 80;
server_name example.com;

location / {
proxy_pass http://backend;
}
}
}
  • upstream: 定义后端服务器组。
  • proxy_pass: 将请求转发到后端服务器组。