上一篇
物理机配置nginx
- 物理机
- 2025-08-06
- 43
物理机装Nginx:下载对应系统包→解压/编译安装→改conf/nginx.conf设监听端口与根目录→启服务systemctl start nginx,开放防火墙端口,浏览器访问验证
系统环境准备
1 硬件与操作系统选型
| 组件 | 推荐规格 | 说明 |
|---|---|---|
| CPU | ≥4核 | 多核提升并发处理能力 |
| 内存 | ≥8GB | 单台Nginx实例约占用50-100MB内存,预留缓存空间 |
| 存储 | SSD硬盘(系统盘+数据盘) | 系统盘建议50GB以上,数据盘根据业务需求分配 |
| 操作系统 | Ubuntu Server LTS/CentOS | 优先选择长期支持版(如Ubuntu 22.04/CentOS Stream),避免短期失效风险 |
| 网络带宽 | ≥1Gbps | 根据预期流量调整,高并发场景建议万兆网卡 |
2 基础依赖安装
以Ubuntu为例执行以下命令:

# 更新软件源 apt update && apt upgrade -y # 安装必要依赖库 apt install -y software-properties-common curl wget libssl-dev zlib1g-dev make gcc
Nginx安装方式对比与实施
1 三种主流安装方案
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 官方APT仓库安装 | 简单快捷 自动更新补丁 |
版本滞后于最新版 | 快速部署/低风险环境 |
| 源码编译安装 | 最新版本 自定义模块 |
编译耗时 维护成本高 |
功能定制/性能极致需求 |
| Docker容器化部署 | 环境隔离 快速迁移 |
额外学习成本 IO损耗 |
微服务架构/混合云 |
2 官方仓库安装示例(Ubuntu)
# 添加Nginx Mainline PPA(获取最新稳定版) add-apt-repository ppa:nginx/stable apt update # 安装主程序及常用模块 apt install -y nginx nginx-extras # 启动并设为开机自启 systemctl enable --now nginx
核心配置文件解析(/etc/nginx/nginx.conf)
1 全局模块配置段
# 工作进程数 = CPU物理核心数
worker_processes auto; # auto表示自动匹配CPU核心数
# 事件驱动模型(epoll/kqueue等)
events {
use epoll; # Linux专属高效事件模型
worker_connections 10240; # 单个进程最大连接数
}
2 HTTP主模块配置
http {
# 日志格式定义
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 buffer=16k;
# 错误日志级别
error_log /var/log/nginx/error.log warn;
# 客户端请求超时时间(单位:秒)
client_max_body_size 100m; # 上传文件大小限制
client_body_timeout 60s; # 请求体读取超时
client_header_timeout 60s; # 请求头读取超时
# 保持长连接相关参数
keepalive_timeout 65; # TCP连接复用超时
keepalive_requests 100; # 单连接最大请求数
# GZIP压缩配置
gzip on; # 开启压缩
gzip_min_length 1k; # 最小压缩文件大小
gzip_types text/plain application/javascript; # 压缩类型
}
3 虚拟主机配置示例(/etc/nginx/sites-available/default)
server {
listen 80; # 监听端口
server_name example.com; # 域名解析
root /var/www/html; # 网站根目录
index index.html; # 默认索引文件
location / {
try_files $uri $uri/ =404; # 优先尝试精确匹配,其次目录索引,最后404
}
# 静态资源加速配置
location ~ .(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d; # 浏览器缓存30天
add_header Cache-Control "public";
}
# PHP反向代理示例
location ~ .php$ {
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; # FastCGI UnixSocket
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params; # 包含默认FastCGI参数
}
}
高级功能配置
1 HTTPS证书部署(Let’s Encrypt)
# 安装Certbot插件 apt install -y certbot python3-certbot-nginx # 申请证书(自动修改Nginx配置) certbot --nginx -d example.com -d www.example.com # 自动续期(crontab添加) 0 0 2 root /usr/bin/certbot renew --quiet --post-hook "systemctl restart nginx"
2 负载均衡配置示例
upstream app_cluster {
least_conn; # 根据最少连接数分配请求
server 192.168.1.101:8080; # 后端服务器1
server 192.168.1.102:8080; # 后端服务器2
server 192.168.1.103:8080 backup; # 备用服务器
}
server {
listen 80;
location / {
proxy_pass http://app_cluster; # 转发至上游服务器组
proxy_set_header Host $host; # 传递原始Host头
proxy_set_header X-Real-IP $remote_addr; # 记录真实客户端IP
}
}
3 安全防护配置
# 禁止反面User-Agent
map $http_user_agent $bad_bot {
default 0;
~(Scrapy|Bot|Crawler) 1; # 拦截爬虫类UA
}
server {
# IP黑名单(CIDR格式)
deny 192.168.1.100/32; # 封禁特定IP
# 请求频率限制(每分钟最多10次)
limit_req_zone $binary_remote_addr zone=perip:10m rate=10r/m;
location /api/ {
limit_req zone=perip burst=20 nodelay; # 突发请求缓冲区大小
}
}
性能优化策略
| 优化项 | 默认值 | 推荐值 | 作用说明 |
|---|---|---|---|
| worker_connections | 512 | 10240 | 单个进程最大并发连接数 |
| worker_rlimit_nofile | unlimited | 20480 | 单个进程可打开的最大文件描述符数量 |
| sendfile on | off | on | 启用零拷贝发送文件 |
| tcp_nopush on | off | on | 减少小包发送次数 |
| directio size | off | 4m | 大文件直接I/O操作 |
| output_buffers | off | 8 16k | 输出缓冲区设置 |
| postponed_accept | off | on | 延迟建立TCP连接直至数据准备好 |
| multi_accept | off | on | 允许同时接受多个新连接 |
| epoll { | Linux专属事件模型参数 | ||
| worker_connections | 10240 | 同全局worker_connections保持一致 |
日志管理与监控
1 日志切割配置(/etc/logrotate.d/nginx)
/var/log/nginx/.log {
daily # 每日切割
missingok # 忽略缺失文件错误
rotate 7 # 保留最近7天日志
compress # 压缩旧日志
delaycompress # 延迟一天压缩(避免当天日志被压缩)
notifempty # 空日志不切割
create 640 nginx # 新建日志文件权限
sharedscripts # 共享脚本参数
postrotate # 切割后执行命令
[ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid` > /dev/null 2>/dev/null || true
endscript
}
2 Prometheus监控集成
# 在http模块中添加监控端点
location /metrics {
stub_status on; # 启用基础状态监控
allow 127.0.0.1; # 仅本地访问(生产环境需替换为监控IP)
deny all;
}
结合nginx-module-vts模块可实现更详细的指标采集。
常见问题FAQs
Q1: Nginx启动失败提示”Address already in use”?
A: 这是由于目标端口已被其他进程占用,解决方法:

- 使用
netstat -tulnp | grep <PORT>查看占用进程PID; - 根据情况选择以下操作之一:
kill -9 <PID>强制终止冲突进程;- 修改Nginx配置文件中的
listen端口; - 检查是否存在僵尸进程残留。
Q2: 访问静态资源出现403 Forbidden错误?
A: 常见原因及解决方案:

- 文件权限不足:执行
chmod -R 755 /path/to/static赋予读权限; - SELinux阻止访问:临时禁用验证
setsebool -P httpd_can_network_connect on; - 目录遍历限制:检查
autoindex模块是否启用,或添加autoindex on;到对应location块; - 根目录配置错误:确认
root指令指向正确的静态资源目录。
