Nginx Web服务器基础配置与负载均衡实现
服务器概述
服务器是专为提供计算服务而设计的设备,相较于普通PC,具备更高的稳定性、并发处理能力和可扩展性。
所有互联网应用都依赖于服务器作为基础支撑。当我们访问网站时,实际上是通过域名系统(DNS)将域名解析为IP地址,然后浏览器连接到对应服务器获取资源。
可以这样理解:服务器如同房屋,域名如同户主姓名(唯一标识),IP地址如同身份证号码(具体位置)。
Web服务器与应用服务器
Web服务器是运行在物理服务器上的软件程序,负责接收和分发网络请求。其处理能力直接影响网站的并发性能。常见的Web服务器包括Apache和Nginx。
Web应用服务器专注于执行业务逻辑代码,同时具备处理网络请求的功能。为了提升并发性能,通常会在应用服务器前部署Web服务器。典型的例子包括Tomcat、uWSGI和Gunicorn等Python应用服务器。
Nginx简介
Nginx是一款高性能的HTTP和反向代理服务器,同时支持IMAP/POP3/SMTP协议。主要特性包括:
- 轻量级设计,高并发处理能力
- 高效的静态资源处理
- 内置负载均衡功能
负载均衡实现
大型网站通常由多台服务器集群提供服务,单一服务器难以承载巨大流量。负载均衡技术将请求分散到不同服务器,提升整体处理能力。
负载均衡分为硬件负载均衡(如F5设备)和软件负载均衡(如Nginx、Apache)。以下是Nginx负载均衡配置示例:
http {
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend_cluster;
}
}
upstream backend_cluster {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
}
除了轮询方式,还支持以下负载策略:
权重分配
upstream backend_cluster {
server 192.168.1.10:8080 weight=1;
server 192.168.1.11:8080 weight=2;
server 192.168.1.12:8080 weight=3;
}
IP哈希
upstream backend_cluster {
ip_hash;
server 192.168.1.10:8080 weight=1;
server 192.168.1.11:8080 weight=2;
server 192.168.1.12:8080 weight=3;
}
跨域问题解决方案
浏览器的同源策略限制了跨域资源共享。当协议、域名或端口任一不同时,就会产生跨域问题。Nginx通过反向代理可以有效解决这一问题。
server {
listen 80;
server_name mydomain.com;
location /api/ {
proxy_pass http://backend-server:3000/;
}
location /admin/ {
proxy_pass http://admin-server:4000/;
}
location /external/ {
proxy_pass http://external-service.com/;
}
}
上述配置实现了:
- mydomain.com/api/* 请求转发至本地3000端口服务
- mydomain.com/admin/* 请求转发至本地4000端口服务
- mydomain.com/external/* 请求转发至外部服务
Location匹配规则
当URL匹配多个location时,Nginx会选择最长匹配项:
# 匹配 /service/ 路径
location /service/ {
proxy_pass http://backend/;
}
# 精确匹配 /service 目录
location /service {
proxy_pass http://backend;
}
完整Nginx配置示例
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
location / {
proxy_pass http://localhost:8080;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
高级配置示例
user nginx;
worker_processes auto;
events {
worker_connections 1024;
}
http {
log_format custom '[($remote_addr) - ($remote_user [$time_local]) $request" '
'($status) ($http_user_agent)($http_x_forwarded_for)'
'($upstream_addr) ($upstream_response_time) ($request_time)]';
proxy_cache_path /cache/nginx levels=1:2 keys_zone=cache_zone:100m
inactive=7d max_size=10g;
gzip on;
gzip_types text/plain application/javascript text/css;
upstream app_servers {
server localhost:8000;
}
server {
listen 80;
server_name example.com;
location /static/ {
alias /var/www/static/;
}
location / {
proxy_cache cache_zone;
proxy_cache_key $uri;
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
proxy_pass http://app_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;
}
}
# HTTPS配置
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location / {
proxy_pass http://app_servers;
}
}
}