【深入理解Nginx】

server/2024/12/20 13:42:59/

深入理解Nginx

介绍

Nginx(发音为 “engine-x”)是一款高性能的HTTP服务器和反向代理服务器,同时支持IMAP/POP3协议。它以其高并发处理能力、稳定性、丰富的功能集、简单的配置和低资源消耗而受到广泛欢迎。Nginx特别适合提供静态文件服务、作为反向代理、负载均衡器和API网关。

特性

  • 高并发性能:能够处理大量的并发连接。
  • 模块化设计:灵活的模块系统允许根据需求编译不同的功能。
  • 反向代理和负载均衡:可以将请求分发到多个后端服务器,并能实现故障转移。
  • 静态文件服务:高效地提供静态文件,如图片、CSS、JavaScript等。
  • 动态内容处理:通过FastCGI、uWSGI、SCGI等协议与后端应用服务器交互。
  • SSL/TLS支持:提供HTTPS服务,支持SNI(Server Name Indication)。
  • 缓存:减少后端压力,提高响应速度。
  • 日志记录:详细记录访问和错误信息。
  • 易用性:配置简单,文档详尽。
  • 跨平台:适用于Linux, Unix, BSD, Mac OS X, Solaris, AIX等多种操作系统。

基本配置示例说明

以下是一个基本的Nginx配置文件,展示了如何设置一个简单的Web服务器来提供静态内容,并配置一个反向代理到后端应用服务器。

nginx">user  nginx;
worker_processes  auto;error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;events {worker_connections  1024;
}http {include       /etc/nginx/mime.types;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;tcp_nodelay     on;keepalive_timeout  65;gzip  on;server {listen       80;server_name  example.com www.example.com;root   /usr/share/nginx/html;index  index.html index.htm;location / {try_files $uri $uri/ =404;}location /app/ {proxy_pass http://backend_server;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_set_header X-Forwarded-Proto $scheme;}error_page  404              /404.html;location = /404.html {internal;}error_page   500 502 503 504  /50x.html;location = /50x.html {internal;}}upstream backend_server {server 192.168.1.10:8080 weight=5;server 192.168.1.11:8080;server 192.168.1.12:8080 backup;}
}

高级配置示例说明

负载均衡策略

Nginx支持多种负载均衡算法,包括但不限于:

  • 轮询(Round Robin):默认算法,依次分配请求给每个后端服务器。
  • 权重(Weight):根据指定的权重值按比例分配请求。
  • 最少连接(Least Connections):将请求分配给当前连接数最少的服务器。
  • IP哈希(IP Hash):根据客户端的IP地址进行哈希运算,确保同一IP的请求总是被分配到同一台服务器。
nginx">upstream backend_servers {least_conn;  # 使用最少连接算法server 192.168.1.10:8080 weight=3;server 192.168.1.11:8080;server 192.168.1.12:8080 backup;
}

并发控制与限流

Nginx可以通过limit_req指令限制每秒请求数,防止过载。

nginx">http {limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;server {location /search/ {limit_req zone=one burst=5 nodelay;proxy_pass http://backend_servers;}}
}

在这个例子中,rate=1r/s表示每秒最多处理1个请求,burst=5允许突发情况下额外处理5个请求,nodelay参数使得这5个额外请求不会被延迟处理。

缓存

Nginx可以通过proxy_cache指令启用缓存。

nginx">http {proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;server {location /cached/ {proxy_cache my_cache;proxy_cache_valid 200 302 10m;proxy_cache_valid 404 1m;proxy_pass http://backend_servers;}}
}

反向代理

反向代理是Nginx的核心功能之一,用于将客户端请求转发给后端服务器,并将后端服务器的响应返回给客户端。

nginx">server {listen 80;server_name your_domain.com;location /app/ {proxy_pass http://backend_servers;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_set_header X-Forwarded-Proto $scheme;}
}

安全设置

为了增强安全性,可以启用HTTPS,并配置HSTS(HTTP Strict Transport Security)、CSP(Content Security Policy)等安全头。

nginx">server {listen 443 ssl;server_name example.com;ssl_certificate /etc/nginx/ssl/example.com.crt;ssl_certificate_key /etc/nginx/ssl/example.com.key;add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline';";location / {proxy_pass http://backend_servers;}
}

跨域设置

跨域资源共享(CORS, Cross-Origin Resource Sharing)是一种机制,它允许或拒绝来自不同源的Web页面访问服务器资源。在配置Nginx时,可以通过添加特定的HTTP头来实现CORS的支持。

下面是一个基本的Nginx配置文件示例,展示了如何配置CORS。这个示例假设你的Nginx服务器运行在一个简单的环境中,并且你希望允许所有跨域请求:

nginx">server {listen 80;server_name yourdomain.com;location / {# 设置CORS相关的HTTP头add_header 'Access-Control-Allow-Origin' '*'; # 允许所有域名访问add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; # 允许的HTTP方法add_header 'Access-Control-Allow-Headers' 'Origin, Content-Type, Accept, Authorization'; # 允许的HTTP头# 对于OPTIONS请求,通常用于CORS预检请求,返回204状态码if ($request_method = 'OPTIONS') {add_header 'Access-Control-Max-Age' 1728000; # 预检请求结果缓存时间(秒)add_header 'Content-Type' 'text/plain charset=UTF-8';add_header 'Content-Length' 0;return 204;}# 你的其他配置,例如代理传递、静态文件服务等proxy_pass http://localhost:8080; # 示例:将请求代理到后端服务器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_set_header X-Forwarded-Proto $scheme;}# 其他location块和配置# ...
}
说明:
  1. add_header 'Access-Control-Allow-Origin' '*';

    • 允许所有域名访问资源。如果你只想允许特定的域名,可以将'*'替换为具体的域名,例如http://example.com
  2. add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';

    • 指定允许的HTTP方法。常用的方法包括GET、POST和OPTIONS(用于CORS预检请求)。
  3. add_header 'Access-Control-Allow-Headers' 'Origin, Content-Type, Accept, Authorization';

    • 指定允许的HTTP头。这里包含了常见的请求头,如Authorization,这在需要身份验证的情况下很有用。
  4. 处理OPTIONS请求

    • 对于CORS预检请求(通常使用OPTIONS方法),Nginx配置会返回204状态码,并设置一些额外的CORS头。Access-Control-Max-Age头指定了预检请求结果的缓存时间(以秒为单位)。
  5. proxy_pass和其他代理设置

    • 示例中展示了如何将请求代理到后端服务器(如运行在localhost:8080的Node.js应用)。这些设置通常用于反向代理配置。

集群配置

在生产环境中,通常会使用多个Nginx实例形成集群,以提高可用性和扩展性。集群可以通过以下几种方式实现:

  • 多台物理服务器:在不同的物理服务器上部署Nginx实例,通过DNS轮询或外部负载均衡设备分配流量。
  • 容器化部署:使用Docker或其他容器技术,在多个节点上运行Nginx容器,结合Kubernetes等容器编排工具管理集群。
  • 分布式存储:对于需要共享状态的服务(如缓存),可以使用分布式存储解决方案(如Redis、Memcached)来保持数据一致性。

总结

Nginx是一款强大且灵活的Web服务器和反向代理服务器,适用于各种规模的应用程序。它的高性能和低资源消耗使其成为处理高并发流量的理想选择。通过合理的配置,Nginx不仅可以作为静态文件服务器使用,还可以执行复杂的任务,如负载均衡、限流、缓存和安全强化。无论是小型网站还是大型互联网应用,Nginx都能提供稳定可靠的服务。随着对Nginx理解的加深,你可以利用其丰富的特性和模块来优化你的网络架构,提升系统的整体性能和安全性。


http://www.ppmy.cn/server/151713.html

相关文章

HCIA-Access V2.5_3_3_2_VLAN路由配置与实现

单臂路由的配置 交换机通过0/1端口连接VLAN100的用户,通过0/2端口连接VLAN200的用户,然后通过0/24连接上层的路由器,整个配置分为两个模块,一个是交换机的配置,另外一个是路由器的配置,对于交换机的配置&am…

聊聊开源的虚拟化平台--PVE

原文链接:聊聊开源的虚拟化平台–PVE PVE(Proxmox Virtual Environment)是一种开源的虚拟化平台,支持容器化(LXC)和虚拟机(KVM),可用于创建和管理虚拟化环境。它基于Debi…

docker容器的安装以及用法

1、了解docker 1.1、docker是什么 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现…

vue-cli 5接入模块联邦 module federation

vue-cli 5接入模块联邦 module federation 模块联邦概念实现思路配置遇到的问题: 模块联邦概念 模块联邦由webpack 5最先推出的,让应用加载远程的代码模块来实现不同的Web应用共享代码片段.模块联邦分为两个角色,一个是生产者,一个是消费者.生产者暴露代码供消费者消费 (用一个…

milvus 支持向量化索引的方法

Milvus 是一个高性能的向量数据库,支持多种向量索引方法,以优化不同的查询需求。Milvus 支持以下几种常见的向量化索引方法: IVF (Inverted File): IVF_FLAT:基于倒排索引和线性扫描的简单方法,适用于小型数…

分布式接口防抖

目录 前言什么是防抖? 防抖 vs 节流 思路解析分布式部署下如何做接口防抖? 使用 Redis 实现分布式锁 生成唯一 Key设置请求锁释放请求锁处理重复提交判断 总结 前言 在高并发的分布式系统中,接口防抖(Debouncing)是…

GC.2015.四年级

GC.2015.四年级.01.奖励 题目描述 晨晨班主任想奖励班里面的每个学生一只圆珠笔和铅笔,已知每只圆珠笔和铅笔的价格,以及班里面的学生人数n,你能帮助老师算出总价吗? 输入格式 第一行:一个整数n,代表班里…

Kaggler日志--Day9

进度24/12/18 昨日复盘: 补充并解决Day7Kaggler日志–Day7统计的部分问题 今日进度: 继续完成Day8Kaggler日志–Day8统计问题的解答 明日规划: 今天报名了Regression with an Insurance Dataset算是新手村练习比赛,截止时间是2…