Nginx配置学习及多应用场景配置示例

一.Nginx简要

先简单介绍一下Nginx :用于高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。它由俄罗斯程序员Igor Sysoev开发,最初是为解决C10K问题(即同时处理1万个连接)而设计的。
特点 :高性能,低内存消耗,高可靠性,模块化设计,支持热部署
适用性:Windows和Linux都行

配置文件nginx.conf由多个块组成:
全局块(最外层) :配置影响nginx全局的指令
events块(与全局块同级) :配置网络连接相关的参数,会影响nginx服务器或与用户的网络连接
http块(与全局块同级) :可以嵌套多个server,配置代理,缓存,日志定义等
server块(嵌套在 http 块内) :配置虚拟主机的相关参数
location块(嵌套在 server 块内):配置请求的路由,以及各种页面的处理情况

二.不同平台配置示例

示例配置,主要用于了解配置格式,这里分别不同平台举例2份

Windows 版 Nginx 配置示例

bash 复制代码
# 主进程配置块
worker_processes  1;  # Windows平台建议设置为1,因为Windows的I/O模型与Linux不同

# 事件处理模块配置
events {
    worker_connections  1024;  # 每个工作进程的最大连接数
    accept_mutex off;  # Windows平台需要关闭这个选项
}

# HTTP服务配置
http {
    # 包含MIME类型定义文件
    include       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  logs/access.log  main;  # 访问日志路径和格式
    error_log   logs/error.log;  # 错误日志路径
    
    # 性能优化配置
    sendfile        on;  # 启用高效文件传输模式
    tcp_nopush     on;  # 仅在sendfile开启时有效,优化网络包发送
    keepalive_timeout  65;  # 保持连接的超时时间(秒)
    
    # 启用Gzip压缩
    gzip  on;  # 开启Gzip压缩功能
    gzip_types text/plain text/css application/json application/javascript text/xml;  # 需要压缩的文件类型
    
    # 虚拟主机配置
    server {
        listen       80;  # 监听80端口
        server_name  localhost;  # 服务器名称,可以是域名或IP
        
        # 字符集设置
        charset utf-8;  # 设置默认字符集
        
        # 网站根目录配置
        root   html;  # 网站文件根目录(相对于nginx安装目录)
        index  index.html index.htm;  # 默认首页文件
        
        # 静态文件缓存设置
        location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
            expires 30d;  # 静态资源缓存30天
            access_log off;  # 不记录静态资源访问日志
        }
        
        # 错误页面配置
        error_page  404     /404.html;  # 404错误页面
        error_page  500 502 503 504  /50x.html;  # 50x错误页面
        
        # 禁止访问隐藏文件
        location ~ /\. {
            deny all;  # 拒绝所有访问
            access_log off;  # 不记录访问日志
            log_not_found off;  # 不记录未找到日志
        }
    }
}

Linux 版 Nginx 配置示例

shell 复制代码
# 全局配置
user  nginx;  # 以nginx用户身份运行工作进程
worker_processes  auto;  # 自动检测CPU核心数设置工作进程数
pid /run/nginx.pid;  # 主进程PID文件位置

# 事件处理模块配置
events {
    worker_connections  2048;  # 每个工作进程的最大连接数
    multi_accept on;  # 一个工作进程可以同时接受多个新连接
    use epoll;  # Linux高性能事件模型
}

# 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;  # 访问日志路径
    error_log   /var/log/nginx/error.log warn;  # 错误日志路径及记录级别
    
    # 性能优化配置
    sendfile        on;  # 启用高效文件传输模式
    tcp_nopush     on;  # 优化网络包发送
    tcp_nodelay    on;  # 禁用Nagle算法
    keepalive_timeout  65;  # 保持连接的超时时间
    types_hash_max_size 2048;  # 类型哈希表大小
    
    # 虚拟主机配置
    server {
        listen       80;  # 监听80端口
        server_name  example.com www.example.com;  # 服务器域名
        
        # 网站根目录配置
        root   /var/www/html;  # 网站文件根目录
        index  index.php index.html index.htm;  # 默认首页文件
        
        # 基础安全头设置
        add_header X-Frame-Options "SAMEORIGIN";  # 防止点击劫持
        add_header X-XSS-Protection "1; mode=block";  # 启用XSS保护
        add_header X-Content-Type-Options "nosniff";  # 禁止MIME类型嗅探
        
        # PHP处理配置
        location ~ \.php$ {
            fastcgi_pass   unix:/var/run/php/php7.4-fpm.sock;  # PHP-FPM套接字
            fastcgi_index  index.php;
            include        fastcgi_params;  # 包含FastCGI参数
            fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }
        
        # 静态文件处理
        location / {
            try_files $uri $uri/ =404;  # 尝试按顺序查找文件
        }
        
        # 静态资源缓存
        location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
            expires 365d;  # 缓存1年
            access_log off;  # 不记录访问日志
            add_header Cache-Control "public";  # 允许公共缓存
        }
        
        # 禁止访问敏感文件
        location ~ /(\.|conf|sql|bak|sh|env)$ {
            deny all;  # 拒绝所有访问
            return 404;  # 返回404错误
        }
    }
}

三.多应用场景配置示例

全局配置示例

场景概要:控制Nginx服务级别的全局参数,影响所有server块的默认行为

后续其他场景仅示例关键配置,其他全局配置可套用

bash 复制代码
# 定义运行Nginx的用户/组(需与系统用户一致)
user www-data;

# 工作进程数(建议设置为CPU核心数或auto自动检测)
worker_processes auto;

# 错误日志路径及级别(debug/info/notice/warn/error/crit)
error_log /var/log/nginx/error.log warn;

# PID文件路径(记录主进程ID)
pid /run/nginx.pid;

# 事件模块配置(核心网络参数)
events {
    # 每个worker的最大连接数(决定并发能力)
    worker_connections 1024;
    
    # 使用高效事件模型(Linux建议用epoll)
    use epoll;
    
    # 开启多请求并行接收(提升吞吐量)
    multi_accept on;
}

# HTTP模块全局配置
http {
    # MIME类型映射文件(默认包含text/html等)
    include /etc/nginx/mime.types;
    
    # 默认MIME类型(当无法识别文件类型时使用)
    default_type application/octet-stream;
    
    # 日志格式定义
    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;
    
    # 保持连接超时时间(单位:秒)
    keepalive_timeout 65;
    
    # 客户端请求头缓冲区大小(根据Header大小调整)
    client_header_buffer_size 4k;
    
    # 大型客户端请求头处理(应对复杂Cookie场景)
    large_client_header_buffers 4 16k;
    
    # 客户端请求体最大值(影响文件上传大小)
    client_max_body_size 100m;
    
    # 开启Gzip压缩(降低传输体积)
    gzip on;
    gzip_types text/plain text/css application/json application/javascript;
    
    # 包含其他配置文件(如各站点的server配置)
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

静态网站托管

场景概要:托管纯HTML/CSS/JS等静态资源,无后端交互

bash 复制代码
server {
    # 监听标准HTTP端口
    listen 80;
    
    # 绑定的域名或IP(支持多个值,空格分隔)
    server_name test.com 192.168.1.1;
    
    # 网站文件根目录(必须真实存在)
    root /var/www/html;
    
    # 默认索引文件(按顺序尝试匹配)
    index index.html index.htm;
    
    # 核心请求处理逻辑
    location / {
        # 尝试按顺序查找:精确文件→目录→返回404
        try_files $uri $uri/ =404;
    }
    
    # 禁止访问隐藏文件(增强安全)
    location ~ /\. {
        deny all;
        return 404;
    }
}

正向代理(HTTP代理)

场景概要:作为中间代理服务器转发客户端请求(需客户端显式配置代理)

bash 复制代码
server {
    # 代理服务监听端口
    listen 3128;
    
    # 必须指定DNS解析服务器
    resolver 8.8.8.8 113.113.113.113 valid=300s;
    
    # 所有请求处理
    location / {
        # 关键指令:将请求转发到客户端指定的原始地址
        proxy_pass http://$http_host$request_uri;
        
        # 保留原始Host头
        proxy_set_header Host $http_host;
        
        # 连接超时时间(单位:秒)
        proxy_connect_timeout 5;
        
        # 禁用代理缓存
        proxy_buffering off;
    }
}

反向代理(后端应用)

场景概要:隐藏真实后端服务器,转发请求到内部服务(如Java/Python应用)

bash 复制代码
server {
    # 监听标准HTTP端口
    listen 80;
    
    # 服务域名(API网关场景)
    server_name api.example.com;
    
    # 所有动态请求转发
    location / {
        # 指向后端服务器组(需提前定义upstream)
        proxy_pass http://backend_servers;
        
        # 标准代理头设置(后端获取真实客户端IP)
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        
        # 响应超时时间(单位:秒)
        proxy_read_timeout 30;
    }
    
    # 静态资源单独处理(性能优化)
    location ~* \.(css|js|png)$ {
        # 静态文件本地路径
        root /var/www/static;
        
        # 客户端缓存时间
        expires 30d;
    }
}

负载均衡

场景概要:将流量均匀分配到多个后端服务器,提高系统容错能力

bash 复制代码
# 定义后端服务器集群(需放在http配置块内)
upstream backend_servers {
    # 负载均衡策略(加权轮询)
    server 10.0.0.1:8080 weight=5;  # 50%流量
    server 10.0.0.2:8080 weight=3;  # 30%流量
    server 10.0.0.3:8080 weight=2;  # 20%流量
    
    # 健康检查参数
    max_fails 3;
    fail_timeout 10s;
}

server {
    listen 80;
    server_name test.example.com;
    
    location / {
        # 关键指令:请求转发到后端集群
        proxy_pass http://backend_servers;
        
        # 故障转移配置
        proxy_next_upstream error timeout http_500;
    }
}

HTTPS安全加固

场景概要:启用加密传输并配置安全策略,符合PCI DSS标准

bash 复制代码
server {
    # 强制SSL监听+HTTP/2支持
    listen 443 ssl http2;
    
    # 服务域名
    server_name test.example.com;
    
    # 证书路径(需真实存在)
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    
    # 协议安全配置(禁用旧版TLS)
    ssl_protocols TLSv1.2 TLSv1.3;
    
    # 加密套件配置(仅允许强加密算法)
    ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
    
    # OCSP装订(提升SSL握手性能)
    ssl_stapling on;
    ssl_stapling_verify on;
    
    # 安全响应头(防XSS/点击劫持等)
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header Content-Security-Policy "default-src 'self'";
    
    # 其他业务配置...
}

文件下载服务

场景概要:提供大文件下载支持,可控制下载速度和目录列表

bash 复制代码
server {
    listen 80;
    server_name downloads.example.com;
    
    # 文件存储根目录
    root /mnt/storage;
    
    # 下载限速配置(单位:字节)
    location / {
        limit_rate 1m;          # 全局限速1MB/s
        limit_rate_after 50m;   # 前50MB不限速
        
        # 启用目录列表(慎用)
        autoindex on;
        
        # 文件列表显示格式
        autoindex_format html;
    }
    
    # 特殊目录不限速
    location /vip/ {
        # 关闭限速
        limit_rate off;
    }
}

请求限流

场景概要:防止CC攻击或突发流量打垮后端服务

bash 复制代码
# 全局限流定义(http配置块内)
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=100r/m;

server {
    location /api/ {
        # 应用限流规则(突发队列=5请求)
        limit_req zone=api_limit burst=5 nodelay;
        
        # 超时返回429状态码
        limit_req_status 429;
        
        proxy_pass http://backend;
    }
    
    # 登录接口特殊限制
    location /api/login {
        # 更严格的限制(10请求/分钟)
        limit_req zone=api_limit burst=3;
    }
}

IP黑白名单

场景概要:基于网络层控制访问权限,阻止恶意IP

bash 复制代码
# 地理IP黑名单(http配置块内)
geo $block_ip {
    default 0;
    192.168.2.0/24 1;   # 整个子网
    10.0.0.3 1;         # 单个IP
}

server {
    location / {
        # 黑名单检查
        if ($block_ip) {
            return 403 "Forbidden";
        }
        
        # 白名单模式(允许特定IP段)
        allow 192.168.9.0/24;
        deny all;
        
        # 正常业务处理...
    }
}
相关推荐
forestqq34 分钟前
华为L420国产笔记本(统信UOS桌面专业版1070)安装openEuler2403虚拟机
运维·虚拟化·统信
zzz100661 小时前
Shell 编程基础(续):流程控制与实践
linux·运维·服务器
Narutolxy1 小时前
DMZ层Nginx TLS 终止与安全接入配置实战20250829
redis·nginx·安全
三坛海会大神5552 小时前
《Shell 大道:筑基篇(下)—— 流控筑根基,数据任驱驰》
linux·运维·服务器·bash
十安_数学好题速析3 小时前
数列寻方:等差数列和为完全平方数
笔记·学习·高考
biuyyyxxx3 小时前
Excel数组学习笔记
笔记·学习·算法
2006yu4 小时前
从零开始学习单片机17
单片机·嵌入式硬件·学习
key_Go4 小时前
03.《交换的底层逻辑:从基础到应用》
运维·服务器·网络
励志不掉头发的内向程序员4 小时前
从零开始的python学习——常量与变量
开发语言·python·学习
西猫雷婶4 小时前
神经网络|(十六)概率论基础知识-伽马函数·中
人工智能·深度学习·神经网络·学习·机器学习·概率论