1. Nginx环境安装概述
Nginx作为一款高性能的HTTP和反向代理服务器,在现代Web架构中扮演着关键角色。根据Netcraft的统计,全球超过40%的高流量网站都在使用Nginx。与传统的Apache相比,Nginx采用事件驱动的异步架构,能够轻松应对C10K问题(即单机同时处理1万个连接),这使得它在高并发场景下表现尤为出色。
在实际生产环境中,Nginx通常承担以下角色:
- Web服务器:直接处理静态资源请求
- 反向代理:转发请求到后端应用服务器
- 负载均衡:分配流量到多个服务器节点
- API网关:处理API请求的路由和限流
2. 安装前的准备工作
2.1 系统环境检查
在开始安装前,建议执行以下检查:
bash复制# 查看系统版本
cat /etc/*release
# 检查80端口占用情况
sudo netstat -tulnp | grep :80
# 确认防火墙状态
sudo ufw status
注意:如果系统已安装Apache等占用80端口的服务,需要先停止这些服务或修改Nginx的默认监听端口。
2.2 依赖环境安装
Nginx需要以下基础依赖:
- PCRE:用于支持正则表达式
- zlib:提供gzip压缩功能
- OpenSSL:实现HTTPS加密传输
在Ubuntu/Debian系统安装依赖:
bash复制sudo apt update
sudo apt install -y build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev
在CentOS/RHEL系统安装依赖:
bash复制sudo yum install -y gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel
3. 三种主流安装方式详解
3.1 通过系统包管理器安装
Ubuntu/Debian系统:
bash复制sudo apt install -y nginx
sudo systemctl start nginx
CentOS/RHEL系统:
bash复制sudo yum install -y epel-release
sudo yum install -y nginx
sudo systemctl enable --now nginx
优点:
- 安装简单快捷
- 自动处理依赖关系
- 可通过系统服务管理
缺点:
- 版本可能较旧
- 自定义编译选项受限
3.2 源码编译安装
- 下载最新稳定版源码:
bash复制wget http://nginx.org/download/nginx-1.25.3.tar.gz
tar zxvf nginx-1.25.3.tar.gz
cd nginx-1.25.3
- 配置编译选项(典型生产环境配置):
bash复制./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--with-threads \
--with-file-aio
- 编译并安装:
bash复制make -j$(nproc)
sudo make install
- 创建系统服务(以systemd为例):
bash复制sudo tee /etc/systemd/system/nginx.service <<EOF
[Unit]
Description=nginx - high performance web server
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP \$MAINPID
ExecStop=/bin/kill -s QUIT \$MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now nginx
3.3 使用Docker安装
对于容器化环境,推荐使用官方Nginx镜像:
bash复制docker run -d \
--name my-nginx \
-p 80:80 \
-p 443:443 \
-v /path/to/nginx.conf:/etc/nginx/nginx.conf \
-v /path/to/html:/usr/share/nginx/html \
nginx:1.25
4. 安装后的基本配置
4.1 目录结构说明
典型安装后的关键目录:
code复制/usr/local/nginx/
├── conf/ # 配置文件目录
│ ├── nginx.conf # 主配置文件
│ └── sites-enabled/ # 虚拟主机配置
├── html/ # 默认网站根目录
├── logs/ # 日志目录
└── sbin/ # 可执行文件目录
4.2 基础安全配置建议
- 隐藏Nginx版本信息:
nginx复制server_tokens off;
- 限制HTTP方法:
nginx复制limit_except GET POST {
deny all;
}
- 添加安全头部:
nginx复制add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
add_header X-XSS-Protection "1; mode=block";
5. 常见问题排查
5.1 端口冲突问题
错误信息:
code复制nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
解决方案:
bash复制# 查找占用进程
sudo lsof -i :80
# 停止占用进程或修改Nginx监听端口
sudo vim /etc/nginx/nginx.conf
5.2 权限问题
错误信息:
code复制nginx: [alert] could not open error log file: Permission denied
解决方案:
bash复制sudo chown -R nginx:nginx /var/log/nginx
sudo chmod -R 755 /var/log/nginx
5.3 配置语法检查
每次修改配置后应执行:
bash复制sudo nginx -t
6. 性能调优建议
6.1 工作进程配置
根据CPU核心数优化:
nginx复制worker_processes auto; # 自动匹配CPU核心数
worker_cpu_affinity auto;
worker_rlimit_nofile 65535; # 每个worker能打开的文件描述符数量
6.2 连接数优化
nginx复制events {
worker_connections 4096; # 每个worker的最大连接数
multi_accept on; # 同时接受多个连接
use epoll; # Linux系统推荐使用epoll
}
6.3 缓冲区优化
nginx复制client_body_buffer_size 16K;
client_header_buffer_size 1k;
client_max_body_size 8m;
large_client_header_buffers 4 8k;
7. 进阶功能启用
7.1 启用HTTP/2
nginx复制server {
listen 443 ssl http2;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
...
}
7.2 启用Brotli压缩
编译时添加:
bash复制./configure --with-http_brotli_module
配置示例:
nginx复制brotli on;
brotli_comp_level 6;
brotli_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
8. 监控与日志分析
8.1 启用状态模块
nginx复制location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
访问输出示例:
code复制Active connections: 3
server accepts handled requests
100 100 200
Reading: 0 Writing: 1 Waiting: 2
8.2 日志格式定制
nginx复制log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'rt=$request_time uct="$upstream_connect_time" '
'uht="$upstream_header_time" urt="$upstream_response_time"';
