Web与Nginx网站服务二
Web与Nginx网站服务
Nginx安装与配置详解
全局配置
#user nobody; user nginx # 运行用户
worker_processes 4; # 工作进程数量
#error_log logs/error.log; # 错误日志文件的位置
#pid logs/nginx.pid; # PID文件的位置
I/O事件配置
events {use epoll; # 使用epoll模型(Linux)worker_connections 4096; # 每个进程处理4096个连接
}
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" "$http_x_forwarded_for"';#access_log logs/access.log main; # 访问日志位置sendfile on; # 支持文件发送(下载)keepalive_timeout 65; # 连接保持超时时间#gzip on; # gzip压缩输出
}
Web服务监听配置
server {listen 80; # 监听地址及端口server_name www.fyl.com; # 站点域名charset utf-8; # 网页的默认字符集location / {root html; # 网站根目录的位置index index.html index.php; # 默认首页文件名}# 内部错误的反馈页面error_page 500 502 503 504 /50x.html;# 错误页面配置location = /50x.html {root html;}
}
Nginx虚拟主机配置
基于域名的虚拟主机
server {listen 80;server_name www.yjs.com; # 设置域名www.yjs.comcharset utf-8;access_log logs/www.yjs.access.log; # 设置日志名location / {root /usr/local/nginx/html/yjs; # 设置工作目录index index.html index.php;}
}server {listen 80;server_name www.benet.com; # 设置域名www.benet.comcharset utf-8;access_log logs/www.benet.access.log;location / {root /usr/local/nginx/html/benet;index index.html index.php;}
}
基于IP的虚拟主机
server {listen 192.168.10.22:80; # 设置监听地址192.168.10.22server_name www.yjs.com;# ...其他配置
}server {listen 192.168.10.40:80; # 设置监听地址192.168.10.40server_name www.benet.com;# ...其他配置
}
基于端口的虚拟主机
server {listen 192.168.10.22:8080; # 设置监听8080端口server_name www.yjs.com;# ...其他配置
}server {listen 192.168.10.22:8888; # 设置监听8888端口server_name www.benet.com;# ...其他配置
}
Nginx反向代理与负载均衡
反向代理原理
- 用户请求先到Nginx,再由Nginx转发给后端应用服务器
- Nginx充当"中转站",客户端不知道真正提供服务的后端服务器
配置示例:
server {listen 80;server_name localhost;location / {proxy_pass http://127.0.0.1:8080; # 转发到后端8080端口proxy_set_header Host $host; # 保留原始Host头proxy_set_header X-Real-IP $remote_addr; # 获取客户端真实IPproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
}
负载均衡策略
1. 轮询(Round Robin)
upstream backend {server backend1.example.com;server backend2.example.com;server backend3.example.com;
}
2. 最少连接数(Least Connections)
upstream backend {least_conn;server backend1.example.com;server backend2.example.com;server backend3.example.com;
}
3. IP哈希(IP Hash)
upstream backend {ip_hash;server backend1.example.com;server backend2.example.com;server backend3.example.com;
}
4. 加权轮询(Weighted Round Robin)
upstream backend {server backend1.example.com weight=3;server backend2.example.com weight=1;server backend3.example.com weight=2;
}
5. 带健康检查的配置
upstream backend {server 192.168.0.101 weight=3 max_fails=3 fail_timeout=30s;server 192.168.0.102 weight=1 max_fails=3 fail_timeout=30s;
}
Tomcat:Java Web应用服务器
Tomcat的本质
Tomcat本质上是一个Servlet容器,也可以称作轻量级Web应用服务器(Web Server + Servlet Container)。
主要职责
- 接收HTTP请求(内置简单的HTTP服务器)
- 将请求分发给对应的Web应用(基于URL映射)
- 执行Servlet/JSP并生成响应
- 返回HTTP响应给客户端
目录结构
tomcat/
├── bin/ # 启动/停止脚本
├── conf/ # 配置文件(server.xml、web.xml)
├── lib/ # 依赖库
├── logs/ # 日志文件
├── webapps/ # 部署Web应用的位置
├── work/ # 运行时生成的临时文件
└── temp/ # 临时文件目录
与Nginx配合使用
server {listen 80;server_name your-domain.com;location / {proxy_pass http://127.0.0.1:8080; # 转发到Tomcatproxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
}
LNMP架构:Linux + Nginx + MySQL + PHP
架构组成
组件 | 作用 |
---|---|
Linux | 操作系统,提供稳定运行环境 |
Nginx | Web服务器,处理静态请求、反向代理 |
MySQL | 数据库,存储应用数据 |
PHP | 脚本语言,处理动态请求,生成HTML或JSON |
请求处理流程
- 用户请求 → Nginx
- 静态资源 → Nginx直接返回
- 动态请求(.php)→ Nginx通过fastcgi协议转发给PHP-FPM
- PHP-FPM执行PHP代码,可能查询MySQL数据库
- PHP-FPM将执行结果返回给Nginx
- Nginx将最终响应返回给用户
Nginx支持PHP配置
server {listen 80;server_name your-domain.com;root /usr/share/nginx/html;index index.php index.html index.htm;location / {try_files $uri $uri/ =404;}location ~ \.php$ {fastcgi_pass 127.0.0.1:9000; # PHP-FPM监听地址fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;include fastcgi_params;}
}
Nginx性能优化指南
性能优化配置
worker_processes auto; # 自动设置为CPU核心数
events {worker_connections 10240; # 每个worker最大连接数use epoll; # 使用epoll事件模型(Linux)
}sendfile on; # 开启高效文件传输模式
tcp_nopush on;
tcp_nodelay on;gzip on; # 开启Gzip压缩
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
安全优化
server_tokens off; # 隐藏Nginx版本号
client_max_body_size 10m; # 限制请求大小location ~ /\.ht {deny all; # 防止恶意扫描
}
缓存优化
# 浏览器缓存
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {expires 30d;add_header Cache-Control "public, immutable";
}# 代理缓存
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m;
location / {proxy_cache my_cache;proxy_cache_valid 200 302 10m;proxy_cache_valid 404 1m;
}
常见问题与解决方案
502 Bad Gateway
- 症状:用户访问返回502错误
- 解决:检查后端服务(如PHP-FPM、Tomcat)是否运行,检查proxy_pass或fastcgi_pass配置
404 Not Found
- 症状:静态资源或页面找不到
- 解决:检查root或alias路径是否正确,确认文件是否存在且有读取权限
高并发连接数不足
- 症状:
worker_connections
不足,日志中出现too many open files
错误 - 解决:增加worker_connections值,调整系统文件描述符限制
日志文件过大
- 症状:日志文件占用大量磁盘空间
- 解决:配置日志轮转和压缩,使用logrotate管理日志
总结
Nginx作为一个高性能的Web服务器和反向代理服务器,在现代Web架构中扮演着至关重要的角色。通过合理的配置和优化,Nginx能够处理高并发请求,提供稳定的服务,并与各种后端技术(如Tomcat、PHP-FPM等)无缝集成。
掌握Nginx的配置和优化技巧,对于任何Web开发者和系统管理员来说都是一项宝贵的技能。希望本指南能帮助你更好地理解和使用Nginx,构建高性能、高可用的Web服务。