深入掌握Nginx:正向代理与反向代理详解及配置文件全解析
1. Nginx简介与应用场景
Nginx是一款高性能的开源Web服务器和反向代理服务器,广泛应用于高并发场景,如静态资源托管、负载均衡、API网关等。其核心优势包括:
事件驱动模型:异步非阻塞架构,支持数万并发连接。
模块化设计:通过模块扩展功能(如HTTP/2、gzip压缩)。
轻量高效:内存占用低,适合资源受限环境。
典型应用场景:
静态文件托管
反向代理动态应用(如Node.js、Java服务)
负载均衡集群
安全防护(如DDoS防御、HTTPS加密)
2. 正向代理与反向代理的核心区别
2.1 正向代理(Forward Proxy)
定义:代理客户端访问外部资源,客户端主动配置代理。
特点:
隐藏客户端真实IP(如公司内网访问互联网)。
突破访问限制(如访问被封锁的网站)。
配置示例:
server {
listen 3128; # 监听端口
resolver 8.8.8.8; # DNS解析服务器
location / {
proxy_pass http://$http_host; # 转发所有请求
}
}
2.2 反向代理(Reverse Proxy)
定义:代理服务端接收客户端请求,客户端无感知后端服务。
特点:
隐藏后端服务器,提供负载均衡和安全防护。
支持动态应用加速(如缓存、SSL终止)。
配置示例:
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend_server; # 转发到后端集群
proxy_set_header Host $host; # 传递原始域名
}
}
对比总结:
特性 | 正向代理 | 反向代理 |
---|---|---|
配置主体 | 客户端 | 服务端 |
隐藏对象 | 客户端IP | 后端服务IP |
典型用途 | 访问控制、匿名访问 | 负载均衡、安全防护 |
3. Nginx配置文件结构总览
Nginx的配置文件默认路径为/etc/nginx/nginx.conf
,支持模块化设计,包含以下核心层级:
# 全局块(Main Context)
user nginx;
worker_processes auto;
# events块(Events Context)
events {
worker_connections 1024;
}
# http块(HTTP Context)
http {
# HTTP全局配置
include mime.types;
# server块(虚拟主机)
server {
# server块配置
listen 80;
# location块(请求路径匹配)
location / {
root /var/www/html;
}
}
}
# stream块(TCP/UDP代理,可选)
stream {
server {
listen 3306;
proxy_pass backend_mysql;
}
}
4.Nginx配置文件结构全解析
1.全局块(Main Context)
-
作用范围:影响整个Nginx进程的全局配置。
-
核心指令:
user nginx; # 运行Nginx的用户和组(安全必备)
worker_processes auto; # 工作进程数(建议设为CPU核心数)
error_log /var/log/nginx/error.log warn; # 错误日志路径与级别(debug/info/notice/warn/error)
pid /var/run/nginx.pid; # 存储主进程PID的文件路径
2.events
块(Events Context)
-
作用范围:定义Nginx处理网络连接的事件模型参数。
-
核心指令:
events {
worker_connections 1024; # 单个工作进程的最大并发连接数(总并发量= worker_processes × worker_connections)
use epoll; # 事件模型(Linux推荐epoll,FreeBSD用kqueue)
multi_accept on; # 一次性接受所有新连接
accept_mutex off; # 高并发时建议关闭互斥锁(减少上下文切换)
}
3.http
块(HTTP Context)
3.1 http
块全局指令
-
作用范围:所有HTTP请求的全局配置。
-
核心指令:
http {
# 基础配置
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"';
access_log /var/log/nginx/access.log main; # 访问日志路径与格式
error_log /var/log/nginx/error.log warn;
# 性能优化
sendfile on; # 启用高效文件传输模式
tcp_nopush on; # 仅在sendfile开启时有效,减少网络包数量
keepalive_timeout 65; # 长连接超时时间(单位秒)
client_max_body_size 100m; # 客户端请求体最大限制(防DDoS)
# 压缩配置
gzip on;
gzip_types text/plain text/css application/json;
# 安全增强
server_tokens off; # 隐藏Nginx版本号
}
3.2 server
块(虚拟主机配置)
-
作用范围:定义单个虚拟主机(一个
http
块可包含多个server
块)。 -
核心指令:
server {
listen 80; # 监听端口(可指定IP,如listen 192.168.1.1:80)
server_name example.com; # 匹配的域名(支持通配符和正则表达式)
root /var/www/html; # 网站根目录
index index.html; # 默认首页文件
# SSL配置(HTTPS)
listen 443 ssl;
ssl_certificate /etc/ssl/certs/example.crt;
ssl_certificate_key /etc/ssl/private/example.key;
# 访问控制
deny 192.168.1.100; # 禁止特定IP访问
allow all;
# 错误页面重定向
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
}
3.3 location
块(请求路径匹配)
-
作用范围:在
server
块内定义,根据URI路径匹配处理规则。 -
匹配模式:
-
精确匹配:
location = /path { ... }
-
前缀匹配:
location /prefix/ { ... }
-
正则匹配:
-
location ~ .php$ { ... }
(区分大小写) -
location ~* .jpg$ { ... }
(不区分大小写)
-
-
-
常用指令:
location / {
try_files $uri $uri/ /index.html; # 静态文件优先匹配,不存在则返回首页
}
location /images/ {
alias /data/static/images/; # 路径别名(替换URI中的/images/)
expires 30d; # 浏览器缓存30天
}
location /api/ {
proxy_pass http://backend_server; # 反向代理到后端服务
proxy_set_header Host $host; # 传递原始域名
proxy_set_header X-Real-IP $remote_addr; # 传递客户端真实IP
}
location ~ .php$ {
fastcgi_pass 127.0.0.1:9000; # 转发PHP请求到FastCGI服务
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
3.4 upstream
块(负载均衡配置)
-
作用范围:在
http
块内定义后端服务器集群,用于负载均衡。 -
核心指令:
upstream backend {
# 负载均衡策略(默认轮询)
least_conn; # 最少连接数策略
# ip_hash; # 按客户端IP哈希分配(会话保持)
# 后端服务器列表
server 10.0.0.1:8080 weight=3; # 权重越高,分配请求越多
server 10.0.0.2:8080;
server 10.0.0.3:8080 backup; # 备用服务器(主服务器宕机时启用)
}
server {
location / {
proxy_pass http://backend; # 使用upstream配置的集群
}
}
3.5stream
块(TCP/UDP代理)
-
作用范围:处理非HTTP流量(如数据库、SSH、DNS)。
-
核心指令:
stream {
upstream backend_mysql {
server 10.0.0.1:3306;
server 10.0.0.2:3306;
}
server {
listen 3306; # 监听TCP端口
proxy_pass backend_mysql;
proxy_connect_timeout 5s;
}
}
6. 配置文件示例与注释
# 全局块
user www-data;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
# events块
events {
worker_connections 2048;
use epoll;
}
# http块
http {
include 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"';
access_log /var/log/nginx/access.log main;
sendfile on;
keepalive_timeout 65;
# 虚拟主机1:静态资源服务
server {
listen 80;
server_name static.example.com;
root /var/www/static;
location / {
expires 7d;
add_header Cache-Control "public";
}
}
# 虚拟主机2:反向代理动态应用
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
}
}
# 负载均衡配置
upstream backend {
server 10.0.0.1:8080;
server 10.0.0.2:8080;
}
}
# stream块(MySQL负载均衡)
stream {
upstream mysql_cluster {
server 10.0.0.1:3306;
server 10.0.0.2:3306;
}
server {
listen 3306;
proxy_pass mysql_cluster;
}
}
本文地址:https://www.vps345.com/11845.html