Nginx配置完整手册:从入门到高可用运维实战

服务器 服务器产品
Nginx,作为一款高性能的HTTP和反向代理服务器,已成为现代互联网架构的基石。它凭借其高并发、低内存占用以及无与伦比的稳定性,在全球范围内被广泛使用。

一、引言

Nginx,作为一款高性能的HTTP和反向代理服务器,已成为现代互联网架构的基石。它凭借其高并发、低内存占用以及无与伦比的稳定性,在全球范围内被广泛使用。其核心作用主要体现在三个方面:

反向代理:作为客户端和后端服务器之间的中介,隐藏真实服务器,实现请求的转发和安全控制。

负载均衡:将海量客户端请求分发到多个后端服务器,避免单点故障,提升系统吞吐量和可用性。

静态资源服务:高效处理静态文件(如HTML、CSS、JS、图片),因其高效的文件I/O模型而性能卓越。

所有这些功能都通过一个核心文件来定义——nginx.conf。此配置文件采用分层的、基于块的指令系统,理解其结构是掌握Nginx的关键。

二、配置文件基础架构

一个标准的nginx.conf文件遵循清晰的层级结构,从外到内依次是:

图片图片

main (全局块)├── events (Events块)└── http (HTTP块)    ├── ... (HTTP全局配置)    └── server (Server块)        ├── ... (Server全局配置)        └── location (Location块)

main (全局块)
├── events (Events块)
└── http (HTTP块)
    ├── ... (HTTP全局配置)
    └── server (Server块)
        ├── ... (Server全局配置)
        └── location (Location块)

1. 全局块(Global Block)

这是配置文件的顶层上下文,设置的指令影响Nginx的整体运行。

user nginx nginx;       # 定义运行Nginx进程的用户和组worker_processes auto;   # 工作进程数,通常设置为CPU核心数或`auto`error_log /var/log/nginx/error.log warn; # 错误日志路径及级别pid /var/run/nginx.pid; # 存储主进程ID的文件worker_rlimit_nofile 65535; # 一个进程能打开的最大文件描述符数

user nginx nginx;       # 定义运行Nginx进程的用户和组
worker_processes auto;   # 工作进程数,通常设置为CPU核心数或`auto`
error_log /var/log/nginx/error.log warn; # 错误日志路径及级别
pid /var/run/nginx.pid; # 存储主进程ID的文件
worker_rlimit_nofile 65535; # 一个进程能打开的最大文件描述符数

2. Events块(Events Block)

此块用于配置网络连接相关的参数,直接影响Nginx的并发处理能力。

events {    worker_connections 1024;    # 每个工作进程的最大并发连接数    use epoll;                  # 在Linux上使用高效的事件模型epoll    multi_accept on;            # 允许一个工作进程同时接受多个新连接}

events {
    worker_connections 1024;    # 每个工作进程的最大并发连接数
    use epoll;                  # 在Linux上使用高效的事件模型epoll
    multi_accept on;            # 允许一个工作进程同时接受多个新连接
}

最大客户端连接数估算公式

worker_processes * worker_connections

3. HTTP块(HTTP Block)

这是Nginx 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;        # 启用高效文件传输    tcp_nopush on;      # 在sendfile模式下,确保数据包被完整填充再发送    keepalive_timeout 65; # 客户端长连接超时时间    gzip on;            # 开启Gzip压缩,减少传输数据量    gzip_types text/plain text/css application/json; # 指定压缩类型    # 后续的server块将在此定义    include /etc/nginx/conf.d/*.conf; # 引入其他server配置,便于模块化管理}4. Server块(Server Block)此块用于定义一个虚拟主机,可以基于不同的域名或IP来提供不同的服务。server {    listen 80;                      # 监听端口    server_name example.com www.example.com; # 绑定的域名,支持通配符和正则    root /usr/share/nginx/html;     # 该虚拟主机的根目录    index index.html index.htm;     # 默认索引文件    # 在此可以定义多个location块}

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;        # 启用高效文件传输
    tcp_nopush on;      # 在sendfile模式下,确保数据包被完整填充再发送
    keepalive_timeout 65; # 客户端长连接超时时间
    gzip on;            # 开启Gzip压缩,减少传输数据量
    gzip_types text/plain text/css application/json; # 指定压缩类型
    # 后续的server块将在此定义
    include /etc/nginx/conf.d/*.conf; # 引入其他server配置,便于模块化管理
}
4. Server块(Server Block)
此块用于定义一个虚拟主机,可以基于不同的域名或IP来提供不同的服务。
server {
    listen 80;                      # 监听端口
    server_name example.com www.example.com; # 绑定的域名,支持通配符和正则
    root /usr/share/nginx/html;     # 该虚拟主机的根目录
    index index.html index.htm;     # 默认索引文件
    # 在此可以定义多个location块
}

5. Location块(Location Block)

这是最灵活的配置单元,用于根据请求的URI进行精细化的路由和控制。其匹配规则和优先级是重点。

location [ = | ~ | ~* | ^~ ] /uri/ {    # 配置指令}

location [ = | ~ | ~* | ^~ ] /uri/ {
    # 配置指令
}
  • =:精确匹配。location = /login 只匹配 /login 请求。
  • ^~:前缀匹配,如果匹配成功,则不再进行正则匹配。
  • ~:区分大小写的正则匹配。
  • ~*:不区分大小写的正则匹配。
  • 无符号:普通前缀匹配。

优先级规则=〉 ^~ 〉 按配置文件中的顺序(正则)〉 普通前缀匹配

示例

location /images/ {    # 匹配以 /images/ 开头的任何请求    alias /data/static/images/;}location ~* \.(gif|jpg|jpeg)$ {    # 不区分大小写地匹配常见图片格式    expires 30d; # 设置浏览器缓存    add_header Cache-Control "public";}location = /admin {    # 只精确匹配 /admin    deny all; # 禁止访问    return 403;}

location /images/ {
    # 匹配以 /images/ 开头的任何请求
    alias /data/static/images/;
}
location ~* \.(gif|jpg|jpeg)$ {
    # 不区分大小写地匹配常见图片格式
    expires 30d; # 设置浏览器缓存
    add_header Cache-Control "public";
}
location = /admin {
    # 只精确匹配 /admin
    deny all; # 禁止访问
    return 403;
}

三、实战场景与配置示例

1. 反向代理配置

将请求转发到后端应用服务器(如Tomcat, Node.js, Django等)。

server {    listen 80;    server_name app.example.com;    location / {        proxy_pass http://backend_server; # 指向upstream或具体地址        proxy_set_header Host $host;      # 传递原始请求的Host头        proxy_set_header X-Real-IP $remote_addr; # 传递客户端真实IP        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 追加代理IP链        proxy_set_header X-Forwarded-Proto $scheme; # 传递原始协议(http/https)        # 超时控制        proxy_connect_timeout 30s;        proxy_read_timeout 60s;        proxy_send_timeout 60s;    }}

server {
    listen 80;
    server_name app.example.com;
    location / {
        proxy_pass http://backend_server; # 指向upstream或具体地址
        proxy_set_header Host $host;      # 传递原始请求的Host头
        proxy_set_header X-Real-IP $remote_addr; # 传递客户端真实IP
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 追加代理IP链
        proxy_set_header X-Forwarded-Proto $scheme; # 传递原始协议(http/https)
        # 超时控制
        proxy_connect_timeout 30s;
        proxy_read_timeout 60s;
        proxy_send_timeout 60s;
    }
}

2. 负载均衡策略

使用upstream块定义后端服务器组,并选择不同的负载均衡算法。

http {    upstream backend_server {        # 1. 轮询(默认)        # server 192.168.1.101:8080;        # server 192.168.1.102:8080;        # 2. 加权轮询        server 192.168.1.101:8080 weight=3; # 处理3倍请求        server 192.168.1.102:8080 weight=1;        # 3. IP哈希(保证同一客户端访问固定后端,解决会话保持)        # ip_hash;        # 4. 最少连接数        # least_conn;        # 健康检查(需要nginx-plus或集成第三方模块,如ngx_http_upstream_check_module)        # server 192.168.1.103:8080 backup; # 备份服务器,当其他都不可用时启用    }    server {        listen 80;        server_name app.example.com;        location / {            proxy_pass http://backend_server;        }    }}

http {
    upstream backend_server {
        # 1. 轮询(默认)
        # server 192.168.1.101:8080;
        # server 192.168.1.102:8080;
        # 2. 加权轮询
        server 192.168.1.101:8080 weight=3; # 处理3倍请求
        server 192.168.1.102:8080 weight=1;
        # 3. IP哈希(保证同一客户端访问固定后端,解决会话保持)
        # ip_hash;
        # 4. 最少连接数
        # least_conn;
        # 健康检查(需要nginx-plus或集成第三方模块,如ngx_http_upstream_check_module)
        # server 192.168.1.103:8080 backup; # 备份服务器,当其他都不可用时启用
    }
    server {
        listen 80;
        server_name app.example.com;
        location / {
            proxy_pass http://backend_server;
        }
    }
}

3. SSL/TLS部署

启用HTTPS,保障数据传输安全。

server {    listen 443 ssl http2; # 启用HTTP/2以提升性能    server_name example.com;    ssl_certificate /etc/nginx/ssl/example.com.crt;     # 证书文件路径    ssl_certificate_key /etc/nginx/ssl/example.com.key; # 私钥文件路径    # 安全强化配置    ssl_protocols TLSv1.2 TLSv1.3; # 禁用不安全的TLS版本    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;    ssl_prefer_server_ciphers on;    ssl_session_cache shared:SSL:10m;    ssl_session_timeout 10m;    # 强制HTTPS重定向(可选,在另一个server块中)    # server {    #     listen 80;    #     server_name example.com;    #     return 301 https://$server_name$request_uri;    # }    location / {        root /usr/share/nginx/html;        index index.html;    }}

server {
    listen 443 ssl http2; # 启用HTTP/2以提升性能
    server_name example.com;
    ssl_certificate /etc/nginx/ssl/example.com.crt;     # 证书文件路径
    ssl_certificate_key /etc/nginx/ssl/example.com.key; # 私钥文件路径
    # 安全强化配置
    ssl_protocols TLSv1.2 TLSv1.3; # 禁用不安全的TLS版本
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    # 强制HTTPS重定向(可选,在另一个server块中)
    # server {
    #     listen 80;
    #     server_name example.com;
    #     return 301 https://$server_name$request_uri;
    # }
    location / {
        root /usr/share/nginx/html;
        index index.html;
    }
}

4. 访问控制与限流

保护服务免受滥用和攻击。

# IP黑白名单location /admin/ {    allow 192.168.1.0/24; # 允许内网IP段    allow 203.0.113.1;    # 允许特定IP    deny all;             # 拒绝其他所有IP    return 403;}# 请求速率限制(限流)http {    limit_req_zone $binary_remote_addr znotallow=api:10m rate=10r/s; # 定义限流zone    server {        location /api/ {            limit_req znotallow=api burst=20 nodelay; # 应用限流            proxy_pass http://api_backend;            # 超过频率限制返回429            limit_req_status 429;        }    }}# 连接数限制http {    limit_conn_zone $binary_remote_addr znotallow=addr:10m;    server {        location /download/ {            limit_conn addr 1; # 同一IP同时只能有1个下载连接        }    }}

# IP黑白名单
location /admin/ {
    allow 192.168.1.0/24; # 允许内网IP段
    allow 203.0.113.1;    # 允许特定IP
    deny all;             # 拒绝其他所有IP
    return 403;
}
# 请求速率限制(限流)
http {
    limit_req_zone $binary_remote_addr znotallow=api:10m rate=10r/s; # 定义限流zone
    server {
        location /api/ {
            limit_req znotallow=api burst=20 nodelay; # 应用限流
            proxy_pass http://api_backend;
            # 超过频率限制返回429
            limit_req_status 429;
        }
    }
}
# 连接数限制
http {
    limit_conn_zone $binary_remote_addr znotallow=addr:10m;
    server {
        location /download/ {
            limit_conn addr 1; # 同一IP同时只能有1个下载连接
        }
    }
}

四、性能优化技巧

1. 关键参数调优

# 全局块worker_processes auto; # 与CPU核心数绑定worker_rlimit_nofile 65535; # 提高文件描述符限制events {    worker_connections 65535; # 提高单进程连接数    use epoll; # Linux高效事件模型    multi_accept on;}http {    sendfile on;    tcp_nopush on;    tcp_nodelay on; # 禁用Nagle算法,提高实时性    keepalive_timeout 30; # 适当调整长连接超时    keepalive_requests 1000; # 一个长连接可处理的请求数    # 关闭不必要或敏感的版本信息    server_tokens off;}

# 全局块
worker_processes auto; # 与CPU核心数绑定
worker_rlimit_nofile 65535; # 提高文件描述符限制
events {
    worker_connections 65535; # 提高单进程连接数
    use epoll; # Linux高效事件模型
    multi_accept on;
}
http {
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on; # 禁用Nagle算法,提高实时性
    keepalive_timeout 30; # 适当调整长连接超时
    keepalive_requests 1000; # 一个长连接可处理的请求数
    # 关闭不必要或敏感的版本信息
    server_tokens off;
}

2. 日志管理

日志分割:使用logrotate工具或自定义脚本,避免日志文件过大。

格式自定义:根据需求记录关键字段,避免记录无用信息消耗I/O。

log_format main '$remote_addr - $remote_user [$time_local] "$request" '                '$status $body_bytes_sent "$http_referer" "$request_time"'                '"$http_user_agent" "$http_x_forwarded_for"';# 注意添加了$request_time,用于分析请求处理耗时

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                '$status $body_bytes_sent "$http_referer" "$request_time"'
                '"$http_user_agent" "$http_x_forwarded_for"';
# 注意添加了$request_time,用于分析请求处理耗时

3. 缓存策略

代理缓存:缓存后端应用的响应。

http {    proxy_cache_path /var/cache/nginx levels=1:2 keys_znotallow=my_cache:10m                     max_size=10g inactive=60m use_temp_path=off;    server {        location / {            proxy_cache my_cache;            proxy_cache_key "$scheme$request_method$host$request_uri";            proxy_cache_valid 200 302 10m; # 200和302状态码缓存10分钟            proxy_cache_valid 404 1m;            proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;            add_header X-Cache-Status $upstream_cache_status; # 在响应头中显示缓存命中状态            proxy_pass http://backend;        }    }}

http {
    proxy_cache_path /var/cache/nginx levels=1:2 keys_znotallow=my_cache:10m
                     max_size=10g inactive=60m use_temp_path=off;
    server {
        location / {
            proxy_cache my_cache;
            proxy_cache_key "$scheme$request_method$host$request_uri";
            proxy_cache_valid 200 302 10m; # 200和302状态码缓存10分钟
            proxy_cache_valid 404 1m;
            proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
            add_header X-Cache-Status $upstream_cache_status; # 在响应头中显示缓存命中状态
            proxy_pass http://backend;
        }
    }
}

浏览器缓存:通过设置expiresCache-Control头,让浏览器缓存静态资源。

location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {    expires 1y; # 缓存1年    add_header Cache-Control "public, immutable";}

location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
    expires 1y; # 缓存1年
    add_header Cache-Control "public, immutable";
}

五、常见问题排查

1. 配置文件语法检查

在重启Nginx前,建议进行语法检查。

nginx -t

 # 输出:nginx: configuration file /etc/nginx/nginx.conf test is successful
nginx -t
# 输出:nginx: configuration file /etc/nginx/nginx.conf test is successful

图片

2. 热重载

修改配置后,无需停止服务即可应用新配置。

# 重新加载配置(推荐)需要到nginx根目录 /usr/sbin/nginx -s reloadnginx -s reload# 或者使用systemdsystemctl reload nginx

# 重新加载配置(推荐)需要到nginx根目录 /usr/sbin/nginx -s reload
nginx -s reload
# 或者使用systemd
systemctl reload nginx

执行命令后Nginx主进程发送HUP信号,主进程会检查新配置的语法,然后启动新的工作进程,并优雅地关闭旧的工作进程。

3. 常见的错误处理

403 Forbidden

图片图片

检查root目录路径是否正确。

检查文件权限和user指令指定的用户是否有读取权限。

检查index文件是否存在。

502 Bad Gateway

图片图片

后端服务是否启动并正常运行。

proxy_pass指向的地址和端口是否正确。

防火墙规则是否阻止了Nginx到后端的连接。

后端应用处理超时(检查proxy_read_timeout)。

504 Gateway Timeout

图片图片

后端服务处理时间过长,增加proxy_read_timeout值。

后端服务器资源(CPU、内存、数据库连接)耗尽。

六、高级功能与扩展

1. 动态配置管理

OpenResty:基于Nginx,集成了LuaJIT,允许使用Lua脚本在Nginx的各个处理阶段(如访问、内容、日志)实现复杂业务逻辑,实现动态路由、认证、限流等。

Consul-Template:与Consul服务发现集成,可以根据服务注册中心的变动,自动生成Nginx的Upstream配置并触发重载。

2. 安全加固实践

防止信息泄露server_tokens off; 隐藏Nginx版本号。

安全头设置

add_header X-Frame-Options "SAMEORIGIN" always; # 防点击劫持add_header X-Content-Type-Options "nosniff" always; # 防MIME类型嗅探add_header X-XSS-Protection "1; mode=block" always; # 启用XSS过滤器add_header Referrer-Policy "no-referrer-when-downgrade" always; # 控制Referer头

add_header X-Frame-Options "SAMEORIGIN" always; # 防点击劫持
add_header X-Content-Type-Options "nosniff" always; # 防MIME类型嗅探
add_header X-XSS-Protection "1; mode=block" always; # 启用XSS过滤器
add_header Referrer-Policy "no-referrer-when-downgrade" always; # 控制Referer头

CSRF防护:可通过验证Referer头或使用OpenResty实现Token验证。

3. 监控与可视化

stub_status模块:内置模块,提供基本的状态信息。

location /nginx_status {    stub_status on;    access_log off;    allow 127.0.0.1; # 只允许本地访问    deny all;}

location /nginx_status {
    stub_status on;
    access_log off;
    allow 127.0.0.1; # 只允许本地访问
    deny all;
}

访问http://your-server/nginx_status会得到类似如下输出:

Active connections: 291server accepts handled requests16630948 16630948 31070465Reading: 6 Writing: 179 Waiting: 106

Active connections: 291
server accepts handled requests
16630948 16630948 31070465
Reading: 6 Writing: 179 Waiting: 106

Prometheus监控:使用nginx-prometheus-exporternginx-vts-exporter(需要编译VTS模块)将Nginx指标转换为Prometheus格式,再通过Grafana进行可视化展示。

七、总结与建议

配置文件管理的建议

模块化:不要将所有配置都写在主配置文件中。使用include指令将不同功能的配置(如SSL、gzip、upstream)和不同站点的配置(server块)拆分到/etc/nginx/conf.d//etc/nginx/sites-available/下的独立文件中。

版本控制:将整个/etc/nginx/目录纳入Git等版本控制系统,任何修改都有据可查,便于回滚和团队协作。

注释清晰:为复杂的配置段添加注释,说明其目的和原理。

遵循最小权限原则:文件权限、用户设置都应遵循安全最佳实践。

学习资源

图片图片

官方文档:https://nginx.org/en/docs/ - 最权威、最全面的参考。

图片图片

Nginx Wiki:大量的示例和教程:https://wiki.archlinuxcn.org/wiki/Nginx。

工具链

  nginx -t:每次修改后建议检查一下语法。

  ss / netstat**:检查端口监听和连接状态。

  curl / httpie**:用于测试接口和HTTP头。

附录

生产环境标准配置模板

# === 全局块 ===# 用户组user  nobody;# 工作进程数worker_processes 1;# 日志路径和日志级别error_log  logs/error.log;error_log  logs/error.log  notice;error_log  logs/error.log  info;# 进程文件路径pid logs/nginx.pid;# === events块 ===events {    # 最大连接数    worker_connections  1024;    # 设置网络连接序列化    accept_mutex on;    # 一个进程是否同时接收多个网络连接    multi_accept on;    # 事件驱动模型    use epoll;}# === http块 ===http {                # === http全局块 ===    # 文件扩展名与文件类型映射表    include  mime.types;    # 默认文件类型    default_type  application/octet-stream;    # 是否开启服务日志    access_log off;    # 自定义服务日志格式    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  logs/access.log  main;    # 是否开启高效文件传输模式    sendfile  on;    # 每个进程每次最大传输值    sendfile_max_chunk  100k;    # 长连接超时事件    keepalive_timeout  65;    # 响应客户端的超时事件    send_timeout 75;    # 客户端请求头的区缓冲区大小    client_header_buffer_size 32k;    # 客户端请求头的最大缓冲区数量和大小    large_client_header_buffers 8 32k;    # 允许客户端请求的最大字节数    client_max_body_size  10m;    # 客户端请求体的缓冲区大小    client_body_buffer_size  128k;    # ---配置http_gzip模块---    # 开启gzip压缩输出,可减少网络传输    gzip  on;    # 设置允许压缩的页面最小字节数    gzip_min_length 1k;    # 设置系统获取多少个单位的缓存用于存储gzip的压缩结果数据流    gzip_buffers 4 16k;    # 设置http协议的版本    gzip_http_version 1.0;    # 设置zip压缩比    gzip_comp_level 6;    # 匹配mime类型进行压缩    gzip_types text/plain text/css application/json;    # 设置开启或者关闭后端服务器返回的结果是否压缩    gzip_proxied any;    # 该配置和http头有关系,会在响应头加个vary:Accept-Encoding    gzip_vray on;    # ---配置http_proxy反向代理---    # Nginx跟代理服务器连接超时时间    proxy_connect_timeout 75;    # Nginx与代理服务器两个成功的响应操作之间超时时间    proxy_read_timeout 75;    # Nginx传输文件至代理服务器的超时时间    proxy_send_timeout 100;    # 设置从代理服务器读取并保存用户头信息的缓冲区大小    proxy_buffer_size 4k;    # 设置代理缓冲区大小    proxy_buffers 4 32k;    # 设置高负荷下的缓冲大小    proxy_busy_buffers_size 64k;    # 设置最大临时文件大小,默认1024M    proxy_max_temp_file_size 64k;    # 限制每次写临时文件的大小    proxy_temp_file_write_size 64k;    # 指定临时文件所在的目录    proxy_temp_path proxy_temp;    # 定义tomcat地址    upstream tomcat {       server 192.168.138.100:8888;    }    # === HTTP-server块 ===    server {        # 监听端口        listen 80;        # 监听服务器地址        server_name localhost;        # 每个连接请求上限次数        keepalive_requests 120;        # 字符集        charset utf-8;        # 服务日志所在目录以及日志格式        access_log  logs/host.access.log  main;        # 错误页        error_page 404 /404.html;        error_page 500 502 503 504 /50x.html;        # === HTTP-server-location块 ===        location / {                # 服务器的默认网站根目录位置                root /usr/share/nginx/html;                # 默认访问的文件名                index index.html;                # 拒绝的IP                deny 192.168.56.21;                deny all;                # 允许的IP                allow 192.168.56.10;                allow all;                }        # 设置响应头        location / {                # 设置允许跨域类型                add_header Access-Control-Allow-Origin * always;                # 是否允许信任证书                add_header Access-Control-Allow-Credentials 'true' always;                # 允许的请求头类型                add_header Access-Control-Allow-Headers * always;                # 设置允许的请求方式                add_header Access-Control-Allow-Methods 'PUT,GET,POST,DELETE,OPTIONS' always;                # 处理OPTIONS请求                if ($request_method = 'OPTIONS') {                        return 204;                }        }                # 设置反向代理服务器        location / {                # 反向代理服务器地址                proxy_pass http://192.168.56.23;                # 是否重定向代理服务器地址                proxy_redirect off;                # 设置向代理服务器发送请求时的请求头数据                # cookie                proxy_pass_header Set-Cookie;                # 主机名                proxy_set_header Host $host;                # 真实IP                proxy_set_header X-Real-Ip $remote_addr;                # 表示Http请求端真实IP                proxy_set_header X-Forwarded-For $remote_addr;        }    }    # 配置ssl    server {        # 开启 ssl        ssl on;        # ssl证书路径        ssl_certificate cert.pem;        # ssl证书密钥        ssl_certificate_key cert.key;        # ssl缓存        ssl_session_cache shared:SSL:1m;        # ssl会话超时时间        ssl_session_timeout 5m;        # ssl会话票据        ssl_session_tickets off;        # ssl协议版本        ssl_protocols TLSv1.2;        # ssl密码套件        ssl_ciphers 'HIGH:!aNULL:!MD5';        # 开启ssl服务密码套件        ssl_prefer_server_ciphers on;    }}

# === 全局块 ===
# 用户组
user  nobody;
# 工作进程数
worker_processes 1;
# 日志路径和日志级别
error_log  logs/error.log;
error_log  logs/error.log  notice;
error_log  logs/error.log  info;
# 进程文件路径
pid logs/nginx.pid;
# === events块 ===
events {
    # 最大连接数
    worker_connections  1024;
    # 设置网络连接序列化
    accept_mutex on;
    # 一个进程是否同时接收多个网络连接
    multi_accept on;
    # 事件驱动模型
    use epoll;
}
# === http块 ===
http {
                # === http全局块 ===
    # 文件扩展名与文件类型映射表
    include  mime.types;
    # 默认文件类型
    default_type  application/octet-stream;
    # 是否开启服务日志
    access_log off;
    # 自定义服务日志格式
    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  logs/access.log  main;
    # 是否开启高效文件传输模式
    sendfile  on;
    # 每个进程每次最大传输值
    sendfile_max_chunk  100k;
    # 长连接超时事件
    keepalive_timeout  65;
    # 响应客户端的超时事件
    send_timeout 75;
    # 客户端请求头的区缓冲区大小
    client_header_buffer_size 32k;
    # 客户端请求头的最大缓冲区数量和大小
    large_client_header_buffers 8 32k;
    # 允许客户端请求的最大字节数
    client_max_body_size  10m;
    # 客户端请求体的缓冲区大小
    client_body_buffer_size  128k;
    # ---配置http_gzip模块---
    # 开启gzip压缩输出,可减少网络传输
    gzip  on;
    # 设置允许压缩的页面最小字节数
    gzip_min_length 1k;
    # 设置系统获取多少个单位的缓存用于存储gzip的压缩结果数据流
    gzip_buffers 4 16k;
    # 设置http协议的版本
    gzip_http_version 1.0;
    # 设置zip压缩比
    gzip_comp_level 6;
    # 匹配mime类型进行压缩
    gzip_types text/plain text/css application/json;
    # 设置开启或者关闭后端服务器返回的结果是否压缩
    gzip_proxied any;
    # 该配置和http头有关系,会在响应头加个vary:Accept-Encoding
    gzip_vray on;
    # ---配置http_proxy反向代理---
    # Nginx跟代理服务器连接超时时间
    proxy_connect_timeout 75;
    # Nginx与代理服务器两个成功的响应操作之间超时时间
    proxy_read_timeout 75;
    # Nginx传输文件至代理服务器的超时时间
    proxy_send_timeout 100;
    # 设置从代理服务器读取并保存用户头信息的缓冲区大小
    proxy_buffer_size 4k;
    # 设置代理缓冲区大小
    proxy_buffers 4 32k;
    # 设置高负荷下的缓冲大小
    proxy_busy_buffers_size 64k;
    # 设置最大临时文件大小,默认1024M
    proxy_max_temp_file_size 64k;
    # 限制每次写临时文件的大小
    proxy_temp_file_write_size 64k;
    # 指定临时文件所在的目录
    proxy_temp_path proxy_temp;
    # 定义tomcat地址
    upstream tomcat {
       server 192.168.138.100:8888;
    }
    # === HTTP-server块 ===
    server {
        # 监听端口
        listen 80;
        # 监听服务器地址
        server_name localhost;
        # 每个连接请求上限次数
        keepalive_requests 120;
        # 字符集
        charset utf-8;
        # 服务日志所在目录以及日志格式
        access_log  logs/host.access.log  main;
        # 错误页
        error_page 404 /404.html;
        error_page 500 502 503 504 /50x.html;
        # === HTTP-server-location块 ===
        location / {
                # 服务器的默认网站根目录位置
                root /usr/share/nginx/html;
                # 默认访问的文件名
                index index.html;
                # 拒绝的IP
                deny 192.168.56.21;
                deny all;
                # 允许的IP
                allow 192.168.56.10;
                allow all;        
        }
        # 设置响应头
        location / {
                # 设置允许跨域类型
                add_header Access-Control-Allow-Origin * always;
                # 是否允许信任证书
                add_header Access-Control-Allow-Credentials 'true' always;
                # 允许的请求头类型
                add_header Access-Control-Allow-Headers * always;
                # 设置允许的请求方式
                add_header Access-Control-Allow-Methods 'PUT,GET,POST,DELETE,OPTIONS' always;
                # 处理OPTIONS请求
                if ($request_method = 'OPTIONS') {
                        return 204;
                }
        }        
        # 设置反向代理服务器
        location / {
                # 反向代理服务器地址
                proxy_pass http://192.168.56.23;
                # 是否重定向代理服务器地址
                proxy_redirect off;
                # 设置向代理服务器发送请求时的请求头数据
                # cookie
                proxy_pass_header Set-Cookie;
                # 主机名
                proxy_set_header Host $host;
                # 真实IP
                proxy_set_header X-Real-Ip $remote_addr;
                # 表示Http请求端真实IP
                proxy_set_header X-Forwarded-For $remote_addr;
        }
    }
    # 配置ssl
    server {
        # 开启 ssl
        ssl on;
        # ssl证书路径
        ssl_certificate cert.pem;
        # ssl证书密钥
        ssl_certificate_key cert.key;
        # ssl缓存
        ssl_session_cache shared:SSL:1m;
        # ssl会话超时时间
        ssl_session_timeout 5m;
        # ssl会话票据
        ssl_session_tickets off;
        # ssl协议版本
        ssl_protocols TLSv1.2;
        # ssl密码套件
        ssl_ciphers 'HIGH:!aNULL:!MD5';
        # 开启ssl服务密码套件
        ssl_prefer_server_ciphers on;
    }
}

常用配置参数速查表

指令

上下文

说明与示例

worker_processes

main

工作进程数,auto或CPU核心数

worker_connections

events

单进程最大并发连接数

listen

server

监听端口,listen 80;listen 443 ssl;

server_name

server

虚拟主机关联的域名

root

server, location

定义请求的根目录

index

server, location

定义默认索引文件

location

server

根据URI匹配并配置路由规则

proxy_pass

location, if

设置反向代理的后端地址

upstream

http

定义负载均衡的后端服务器组

ssl_certificate

server

指定SSL证书文件路径

allow/deny

http, server, location

基于IP的访问控制

limit_req_zone

http

定义请求限流的共享内存区域

通过本篇指南,相信大家应该已经对Nginx配置文件有了比较深刻的了解。从希望这篇文章能够帮助大家!


责任编辑:武晓燕 来源: 小明互联网技术分享社区
相关推荐

2024-07-30 08:19:14

2017-07-11 09:37:36

MySQL入门 MyS

2017-01-17 10:25:06

HBase集群运维

2025-02-24 10:07:10

2025-10-09 01:33:00

2024-06-07 08:51:50

OpenPyXLPythonExcel文件

2020-03-04 13:35:23

高可用MySQL数据库

2021-11-29 14:18:05

Nuxt3静态Nuxt2

2013-06-06 13:42:48

OSPF入门配置

2017-09-25 18:32:11

人肉智能运维服务监控

2025-04-22 07:52:59

2023-05-15 08:20:56

2017-10-09 09:12:35

携程运维架构

2016-02-16 17:14:13

高可用系统大众点评

2010-09-08 09:19:54

2009-07-17 08:58:25

IT运维网管软件游龙科技

2022-05-17 11:06:44

数据库MySQL系统

2017-05-27 09:23:10

IOS框架APP框架代码

2017-12-21 15:41:11

华为云

2021-04-15 11:22:36

运维架构技术
点赞
收藏

51CTO技术栈公众号