物理机装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
指令指向正确的静态资源目录。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/94369.html