找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

314

积分

0

好友

40

主题
发表于 15 小时前 | 查看: 2| 回复: 0

Nginx是一款高性能的HTTP和反向代理服务器,以其高并发处理能力、低内存消耗和模块化设计而广受欢迎。本文将从核心配置出发,结合多个实战场景,深入解析Nginx的应用技巧。

Nginx的核心作用

Nginx主要扮演三个关键角色:

  1. Web静态服务器:可用于发布静态网页、图片等资源。
  2. 反向代理与负载均衡器:通过监听80/443端口接收请求,并代理分发至后端多台应用服务器,是实现高可用架构的关键中间件
  3. 邮件代理服务器:尽管此功能在实际生产中使用较少。

其模块化设计(如 locationupstream 模块)是其灵活性的基础。

全局配置优化

全局配置位于 nginx.confmain 上下文,直接影响Nginx实例的性能基础。

worker_processes

此指令定义了Nginx启动的工作进程数量,通常设置为与CPU核心数相等或为其倍数,以充分利用多核性能。

worker_processes auto; # 自动检测CPU核心数
# 或显式指定
worker_processes 2;
worker_rlimit_nofile

设置每个工作进程可打开的最大文件描述符数量。不设置时,将继承系统全局限制。

worker_rlimit_nofile 65535;

你可以使用 ulimit -n 命令查看当前会话的限制,并使用 ulimit -n [数量] 进行临时修改(重启后失效)。

worker_connections 与并发数

worker_connections 定义每个工作进程能够同时处理的最大连接数。它位于 events 块中。

events {
    worker_connections 1024;
}

重要概念:Nginx支持的最大并发连接数理论值为 worker_processes * worker_connectionsworker_rlimit_nofile 是进程级别的文件打开数限制,与 worker_connections 是独立的两套配置。

一个经过优化的配置示例如下:

worker_processes auto;
worker_rlimit_nofile 65535;

events {
    worker_connections 16384;
}

Location 块实战精讲

location 指令是Nginx配置的灵魂,用于匹配URI并定义处理逻辑。

实现域名首页跳转

希望用户访问网站根域名时,直接跳转至登录页。

location / {
    return 301 http://www.yourdomain.com/login$request_uri;
}
路径重定向到指定地址

将特定路径的请求重写并永久重定向到另一个地址。

location /crm/sso/login {
    rewrite ^/(.*)$ http://192.168.0.1/crm/sso/login?usercode=$1 permanent;
}
  • $1 捕获了正则表达式 (.*) 匹配到的内容。
  • permanent 返回301永久重定向状态码。
基于多域名的服务代理

当同一服务路径(如/user)部署在多台机器时,可通过配置多个server块,并绑定不同域名来实现定向代理。

server {
    listen 80;
    server_name user1.domain.com;
    location / {
        proxy_pass http://10.192.168.1:9999/user/;
    }
}
server {
    listen 80;
    server_name user2.domain.com;
    location / {
        proxy_pass http://10.192.168.2:9999/user/;
    }
}

Nginx核心配置与实战场景解析:从负载均衡到安全管控 - 图片 - 1 Nginx核心配置与实战场景解析:从负载均衡到安全管控 - 图片 - 2

拓展

  • 一个Nginx可以配置多个server块,常用于区分内外网访问策略或托管多个网站。
  • 一个server块也可以配置多个server_name,用于同时响应多个域名的请求。

Server块与负载均衡配置

搭建简易负载均衡

使用 upstream 模块定义后端服务器组,并通过 proxy_pass 引用,实现请求的负载分发。

upstream backend_cluster {
    server 10.0.0.1:8080;
    server 10.0.0.2:8080;
    # 可配置权重(weight)、健康检查等参数
}

server {
    listen 80;
    server_name app.domain.com;

    location / {
        proxy_pass http://backend_cluster;
        proxy_set_header Host $host:$server_port;
        # 其他代理头设置...
    }
}

Nginx核心配置与实战场景解析:从负载均衡到安全管控 - 图片 - 3

注意:默认的轮询策略下,前列服务器会略微多接收一些请求。通常建议将配置更高的节点置于前方。

其他常用Server级指令
  • autoindex on;:开启目录浏览功能。
  • listen 80 default_server;:将此服务器块设置为80端口的默认主机。当请求的Host头不匹配任何server_name时,由此块处理。
  • client_max_body_size 128M;:设置客户端请求体最大大小,常用于限制上传文件体积。
  • include /etc/nginx/conf.d/*.conf;:用于引入其他配置文件,是保持主配置简洁的运维最佳实践。

安全与访问控制配置

IP访问限制

限制特定接口仅允许内网IP段访问。

location = /api/secure/interface {
    # 判断远端IP是否不在指定的内网网段
    if ($remote_addr !~* ^10\.(12|192|191)\..*$) {
        return 403;
    }
    proxy_pass http://backend_service;
}

关键点:此处应使用 $remote_addr(直接与Nginx建立连接的客户端IP),而非 $http_origin

获取与传递真实客户端IP

在多层代理环境中,需要使用 X-Forwarded-For 头来传递原始客户端IP。

location / {
    proxy_pass http://backend;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

在后端服务或下一级Nginx中,$proxy_add_x_forwarded_for 变量将包含以逗号分隔的整个代理链IP列表。为记录真实IP,可自定义日志格式:

log_format main '$remote_addr - $http_x_forwarded_for - $remote_user [$time_local] "$request" '
                '$status $body_bytes_sent "$http_referer" "$http_user_agent"';
access_log /var/log/nginx/access.log main;

常见问题排查

  1. nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
    此错误表示80端口已被其他进程(如Apache、另一个Nginx实例)占用。使用 sudo lsof -i:80sudo netstat -tlnp | grep :80 查找并终止占用进程。

  2. 访问服务器IP显示Centos/Apache默认页而非Nginx页面
    这通常意味着Nginx未成功启动,或者80端口仍由其他Web服务器监听。请检查Nginx状态并确保其监听80端口。

  3. Connection refused 错误
    当Nginx无法连接到配置的 upstreamproxy_pass 后端地址时,会出现此错误。请检查:

    • 后端服务是否正在运行。
    • 防火墙是否放行了Nginx服务器到后端端口的连接。
    • upstream 中的服务器地址和端口是否正确。

Nginx与F5的简要对比

特性维度 Nginx F5 BIG-IP
定位 开源软件,轻量级反向代理/Web服务器 商业硬件/虚拟化应用交付控制器(ADC)
高并发 优秀,适用于大多数Web场景 极强,专为超大流量和复杂场景设计
安全性 需自行配置安全模块和规则 提供硬件级安全防护及丰富的内置安全策略
成本 开源免费 商业授权,成本高昂
复杂度 配置相对简单,社区活跃 功能全面且复杂,需专业学习

简而言之,Nginx是灵活、高效的开源解决方案,而F5则提供了企业级、一体化的高级应用交付与安全服务。

官方文档是学习Nginx最权威的资源:https://nginx.org/en/docs/




上一篇:Flink Watermark机制源码深度解析:乱序数据处理与窗口触发原理
下一篇:RocketMQ消息积压亿级数据救援方案:架构师视角下的生产环境故障处理
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2025-12-24 17:25 , Processed in 0.151104 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表