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;
}
}5. 配置文件示例与注释
# 全局块
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;
}
}到此这篇关于nginx正向代理与反向代理及配置文件全解析的文章就介绍到这了,更多相关nginx正向代理与反向代理内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论