阿里云Linux云服务器搭建Nginx:从零到生产级部署完全指南
前言:为什么选择在阿里云ECS上搭建Nginx
在当今的互联网技术生态中,Nginx已然成为Web服务器领域的事实标准。无论是个人博客、企业官网,还是高并发的API网关、微服务架构,Nginx都凭借其事件驱动的异步非阻塞架构,以极低的资源消耗支撑着海量的并发连接。阿里云ECS(弹性云服务器)作为国内市场份额领先的云基础设施,为开发者提供了稳定、灵活、可弹性伸缩的计算资源。将Nginx部署在阿里云ECS上,既能享受云服务器的高可用性与按需付费的经济性,又能充分发挥Nginx在高性能Web服务方面的卓越能力。
本文将从零开始,完整记录在阿里云Linux云服务器上搭建Nginx的全过程。内容涵盖ECS实例的选购与初始化、安全组配置、Nginx的安装与配置、虚拟主机与多站点部署、反向代理与负载均衡、HTTPS加密配置、性能优化与安全加固,以及生产环境下的日志管理与进程守护。无论你是刚接触云服务器的新手,还是希望规范化部署流程的开发者,这份指南都将帮助你避开常见的部署陷阱,快速构建一个稳定可靠的生产级Web服务环境。
需要先登录阿里云控制台,点击:阿里云控制台
第一章:ECS实例准备与环境初始化
1.1 实例选型:不花冤枉钱
选择ECS实例是搭建Nginx的第一步,也是最容易被配置焦虑带偏的一步。许多新手一上来就追求高配,结果资源长期闲置,造成不必要的成本浪费。正确的做法是按实际负载选型,不要提前为以后可能用上的性能付费。
对于个人博客、小型API服务或学习测试环境,推荐从以下配置起步:
- 学习/测试/轻量服务:选择阿里云 u2i 经济型实例,2核4G内存,月成本极低,完全能够满足Nginx的基础运行需求。
- 有一定并发需求的生产环境:推荐 c9i 企业级实例,2核至4核,采用英特尔至强6处理器,单核性能提升约20%,支持AMX矩阵加速和TDX机密计算。
地域选择上,建议优先选择离目标用户群较近的区域。国内项目推荐华东1(杭州)或华北2(北京),网络延迟较低。操作系统方面,本文的演示环境基于Alibaba Cloud Linux 3(阿里云自研的优化版Linux),同时兼容CentOS 7/8及Ubuntu 20.04/22.04等主流发行版。
1.2 安全组配置:云服务器的第一道防线
很多新手拿到服务器后的第一件事就是SSH上去装软件——这个顺序是错误的。安全组是云服务器的第一道防火墙,决定了哪些流量能进、能出。默认的安全组通常只开放了22端口(SSH),我们需要额外放开HTTP和HTTPS所需的端口。
在阿里云控制台依次进入:ECS → 实例 → 安全组 → 配置规则,添加入方向规则:
- 端口22(SSH):协议TCP,授权对象建议限制为你的固定IP地址,避免暴露在公网遭受暴力破解。若IP不固定,后续可通过fail2ban等工具做登录防护。
- 端口80(HTTP):协议TCP,授权对象 0.0.0.0/0,用于对外提供Web服务。
- 端口443(HTTPS):协议TCP,授权对象 0.0.0.0/0,用于提供加密的HTTPS访问。
安全组配置是云服务器特有的网络隔离机制,在操作系统防火墙之前生效。配置完成后,这些端口才真正对外部网络开放。
1.3 SSH连接与系统初始化
安全组配置完成后,通过SSH连接到服务器:
ssh root@你的公网IP首次登录后,建议按顺序完成以下三件事:
第一步:更新系统包
# Alibaba Cloud Linux / CentOS / RHEL
yum update -y
# Ubuntu / Debian
apt update && apt upgrade -y第二步:创建普通用户(避免长期使用root账户)
useradd -m -s /bin/bash deploy
passwd deploy
usermod -aG wheel deploy # CentOS系列
# 或 usermod -aG sudo deploy # Ubuntu系列第三步:配置SSH密钥登录(可选但强烈推荐),将本地公钥添加到服务器的 ~/.ssh/authorized_keys 文件中,实现免密码安全登录。
第二章:Nginx安装:两种方式任你选
Nginx的安装主要有两种方式:使用系统包管理器(yum/apt)快速安装,以及从源码编译安装。前者简单高效,适合大多数场景;后者提供了更大的灵活性,可以按需启用或禁用特定模块。
2.1 方式一:使用包管理器安装(推荐)
包管理器安装是最快捷的方式,系统会自动处理依赖关系并配置好基础服务。
Alibaba Cloud Linux 3 / CentOS 8 及更高版本:
# 添加官方Nginx仓库
tee /etc/yum.repos.d/nginx.repo <<-'EOF'
[nginx-stable]
name=nginx stable repo
baseurl=https://nginx.org/packages/centos/8/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
EOF
# 安装Nginx
dnf -y install nginxCentOS 7:
# 添加EPEL仓库
yum -y install epel-release
# 安装Nginx
yum -y install nginxUbuntu / Debian:
apt update
apt install nginx -y安装完成后,Nginx通常不会自动启动(Ubuntu除外),需要手动启动并设置为开机自启:
systemctl start nginx
systemctl enable nginx
systemctl status nginx通过浏览器访问服务器公网IP,看到Nginx欢迎页面即表示安装成功。
2.2 方式二:从源码编译安装(进阶场景)
当需要特定版本的Nginx,或需要启用某些默认未包含的第三方模块时,源码编译是更好的选择。以下是在CentOS 7上编译安装的完整步骤:
第一步:安装编译依赖
yum install -y gcc make pcre-devel zlib-devel openssl-devel- gcc:C语言编译器,编译Nginx的必需品。
- make:构建工具,用于执行Makefile。
- pcre-devel:提供正则表达式支持,Nginx的rewrite模块依赖此库。
- zlib-devel:提供gzip压缩支持。
- openssl-devel:提供HTTPS支持,如果不需要SSL可以省略,但强烈建议安装。
第二步:下载并解压源码包
wget https://nginx.org/download/nginx-1.26.2.tar.gz
tar -zxvf nginx-1.26.2.tar.gz
cd nginx-1.26.2第三步:配置编译参数
./configure \
--prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_addition_module \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_stub_status_module \
--with-http_auth_request_module \
--with-http_slice_module \
--with-mail \
--with-mail_ssl_module \
--with-file-aio \
--with-threads \
--with-pcre \
--with-zlib关键参数说明:
- --prefix:指定安装目录,默认为 /usr/local/nginx。
- --with-http_ssl_module:启用HTTPS支持。
- --with-http_v2_module:启用HTTP/2协议支持。
- --with-http_stub_status_module:启用状态监控页面。
- --with-http_gzip_static_module:启用静态gzip预压缩支持。
第四步:编译并安装
make
make install安装完成后,可执行文件位于 /usr/local/nginx/sbin/nginx,配置文件位于 /usr/local/nginx/conf/nginx.conf。
第五步:启动Nginx
cd /usr/local/nginx/sbin
./nginx验证进程:
ps -ef | grep nginx看到 master process 和 worker process 即表示启动成功。
第三章:Nginx核心配置文件深度解析
无论通过哪种方式安装,理解Nginx的配置文件结构都是后续所有配置工作的基础。以下以包管理器安装的默认路径(/etc/nginx/)为例进行说明。
3.1 配置文件目录结构
/etc/nginx/
├── nginx.conf # 主配置文件
├── conf.d/ # 额外配置文件目录(所有.conf文件会被自动加载)
├── sites-available/ # 所有可用站点配置文件
├── sites-enabled/ # 已启用的站点配置(软链接指向sites-available)
├── mime.types # MIME类型映射表
└── modules/ # 动态模块目录这种目录结构的核心设计思想是模块化配置。主配置文件 nginx.conf 通过 include 指令引入其他目录下的配置文件。sites-available 与 sites-enabled 的分离设计尤其巧妙:所有站点配置写在 sites-available 中,通过创建符号链接到 sites-enabled 来激活或停用某个站点,便于管理和切换。
3.2 主配置文件详解(nginx.conf)
以下是一个典型的 nginx.conf 核心配置片段:
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
events {
worker_connections 1024;
use epoll;
multi_accept on;
}
http {
include /etc/nginx/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 /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}核心指令说明:
- user:指定运行Nginx工作进程的用户,默认为nginx,增强安全性。
- worker_processes auto:自动根据CPU核心数设置工作进程数量。
- worker_connections 1024:每个工作进程的最大并发连接数。
- use epoll:Linux下使用epoll事件模型,高效处理大量并发连接。
- sendfile on:启用零拷贝技术,提升静态文件传输效率。
- keepalive_timeout 65:长连接超时时间,减少TCP握手开销。
第四章:虚拟主机与多站点配置
虚拟主机(Virtual Host)是Nginx最基础也最常用的功能之一,它允许在一台服务器上托管多个网站,每个网站拥有独立的域名、文档根目录和配置。在Nginx中,虚拟主机通过 server 块来实现。
4.1 创建第一个站点
第一步:创建站点目录与测试页面
mkdir -p /var/www/example.com/html
chown -R $USER:$USER /var/www/example.com/html
chmod -R 755 /var/www
echo "<h1>Hello from Example.com!</h1>" > /var/www/example.com/html/index.html第二步:创建站点配置文件
vim /etc/nginx/sites-available/example.com输入以下内容:
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com/html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
}第三步:激活站点
ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/第四步:测试并重载配置
nginx -t
systemctl reload nginx第五步:配置本地hosts或DNS解析,将域名指向服务器IP,访问即可看到测试页面。
4.2 多站点配置的最佳实践
当需要托管多个站点时,建议为每个站点创建独立的配置文件,放在 /etc/nginx/conf.d/ 目录下,Nginx会自动加载所有 .conf 文件。例如:
/etc/nginx/conf.d/
├── site1.conf
├── site2.conf
└── site3.conf每个配置文件包含一个完整的 server 块,分别指定不同的 server_name 和 root 路径。这种方式清晰明了,便于管理和维护。
第五章:反向代理与负载均衡实战
反向代理是Nginx最强大的功能之一。在反向代理模式下,Nginx接收客户端的请求,然后将请求转发给后端的应用服务器(如Tomcat、Node.js、Gunicorn等),并将后端服务器的响应返回给客户端。这种架构带来了诸多好处:隐藏后端服务器真实IP、负载均衡、SSL终结、缓存加速等。
5.1 配置反向代理
假设后端有一个Java应用运行在8080端口,我们希望将所有请求代理到这个后端服务:
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}关键指令说明:
- proxy_pass:指定后端服务器的地址。
- proxy_set_header:在转发请求时添加或修改请求头,确保后端服务器能获取到客户端的真实IP和协议信息。
5.2 配置负载均衡
当后端有多个应用服务器时,可以通过 upstream 模块实现负载均衡:
upstream backend_servers {
# 默认轮询策略
server 192.168.1.10:8080 weight=3;
server 192.168.1.11:8080 weight=2;
server 192.168.1.12:8080 backup;
}
server {
listen 80;
server_name app.example.com;
location / {
proxy_pass http://backend_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;
}
}负载均衡策略说明:
- 轮询(默认):请求按顺序轮流分配到各后端服务器。
- weight:权重策略,权重越高分配到的请求越多,适用于后端服务器性能不均的场景。
- backup:标记为备用服务器,仅当其他服务器不可用时才接收请求。
- ip_hash:基于客户端IP的哈希分配,确保同一客户端的请求始终分配到同一台服务器(适用于需要会话保持的场景)。
第六章:HTTPS配置:免费SSL证书申请与部署
在当今的互联网环境中,HTTPS已经成为网站的基本配置。HTTP协议以明文方式传输数据,面临着信息泄露、内容篡改、中间人攻击等严重安全风险。主流浏览器会对未启用HTTPS的网站标记为不安全,直接影响用户访问意愿和SEO排名。
6.1 阿里云免费SSL证书申请
阿里云为每个账号每年提供20张免费的个人测试证书(DV单域名),有效期90天,足以满足个人博客和测试环境的需求。
申请步骤:
- 登录阿里云控制台,在顶部搜索框输入SSL证书或数字证书管理服务。
- 在左侧导航栏选择证书管理 → SSL证书管理,点击个人测试证书(原免费证书)页签。
- 点击立即购买,保持默认选项,完成0元支付。
- 点击创建证书,填写需要绑定证书的域名(如 example.com),系统会自动包含 www.example.com。
- 选择验证方式:自动DNS验证(推荐)或手动DNS验证。
- 等待签发完成(通常1~15分钟),下载证书(选择Nginx格式)。
6.2 在Nginx中部署SSL证书
第一步:上传证书文件到服务器
将下载的证书文件(.pem和.key)上传到服务器,建议放在 /etc/nginx/ssl/ 目录下:
mkdir -p /etc/nginx/ssl
# 使用scp或rsync将证书文件上传到该目录第二步:修改Nginx配置
server {
listen 443 ssl http2;
server_name example.com www.example.com;
ssl_certificate /etc/nginx/ssl/example.com.pem;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
# SSL协议与加密套件优化
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
root /var/www/example.com/html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
}
# HTTP自动跳转HTTPS
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$server_name$request_uri;
}第三步:测试并重载配置
nginx -t
systemctl reload nginx访问 https://example.com 即可验证HTTPS是否生效。
6.3 Let's Encrypt自动化证书方案
除了阿里云提供的免费证书,也可以使用Let's Encrypt配合Certbot实现证书的自动化申请与续期:
# 安装Certbot
apt install certbot python3-certbot-nginx -y # Ubuntu
# 或 yum install certbot python3-certbot-nginx -y # CentOS
# 自动申请并配置证书
certbot --nginx -d example.com -d www.example.com
# 测试自动续期
certbot renew --dry-run第七章:性能优化与安全加固
7.1 性能优化核心参数
Nginx的性能优化主要集中在以下几个方面:
工作进程与连接数优化:
worker_processes auto;
worker_rlimit_nofile 65535;
events {
worker_connections 65535;
use epoll;
multi_accept on;
}静态文件缓存优化:
location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg)$ {
expires 30d;
add_header Cache-Control "public, immutable";
access_log off;
log_not_found off;
}Gzip压缩优化:
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css text/xml text/javascript application/json application/javascript application/xml+rss application/rss+xml image/svg+xml;7.2 安全加固最佳实践
1. 限制请求大小,防止缓冲区溢出攻击:
client_max_body_size 10M;
client_body_buffer_size 128k;2. 隐藏Nginx版本信息:
server_tokens off;3. 配置访问限流:
# 在http块中定义限流区域
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
# 在location块中应用限流
location /api/ {
limit_req zone=mylimit burst=20 nodelay;
proxy_pass http://backend_servers;
}4. 配置防盗链:
location ~* \.(jpg|jpeg|png|gif)$ {
valid_referers none blocked example.com *.example.com;
if ($invalid_referer) {
return 403;
}
}5. 添加安全响应头:
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;第八章:日志管理与监控
8.1 日志格式定制
Nginx的日志配置通过 log_format 和 access_log 两个指令完成:
log_format json_combined '{"time_local":"$time_local",'
'"remote_addr":"$remote_addr",'
'"remote_user":"$remote_user",'
'"request":"$request",'
'"status":$status,'
'"body_bytes_sent":$body_bytes_sent,'
'"http_referer":"$http_referer",'
'"http_user_agent":"$http_user_agent",'
'"http_x_forwarded_for":"$http_x_forwarded_for",'
'"request_time":$request_time}';
access_log /var/log/nginx/access.log json_combined;采用JSON格式的日志便于后续导入ELK或阿里云日志服务(SLS)进行集中分析与可视化。
8.2 日志切割与轮转
使用Linux自带的 logrotate 工具管理Nginx日志:
# /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily
missingok
rotate 52
compress
delaycompress
notifempty
create 0640 nginx adm
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}8.3 状态监控页面
启用 stub_status 模块,实时查看Nginx运行状态:
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}访问 http://服务器IP/nginx_status 即可看到活跃连接数、请求总数等关键指标。
第九章:Systemd进程守护与开机自启
对于生产环境,确保Nginx在服务器重启后能够自动恢复运行至关重要。使用systemd可以实现进程守护与开机自启。
包管理器安装的Nginx通常已自动配置好systemd服务。如果是源码编译安装,需要手动创建systemd服务文件:
vim /etc/systemd/system/nginx.service输入以下内容:
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
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启用并启动服务:
systemctl daemon-reload
systemctl enable nginx
systemctl start nginx
systemctl status nginx第十章:常见问题排查与故障处理
10.1 端口被占用
现象:启动Nginx时报错 "bind() to 0.0.0.0:80 failed (98: Address already in use)"。
解决方案:
# 查看80端口占用情况
netstat -tlnp | grep 80
# 杀掉占用进程,或修改Nginx配置文件中的监听端口10.2 配置文件语法错误
现象:重载配置时提示语法错误。
解决方案:
nginx -t该命令会检查配置文件的语法正确性并指出具体错误位置。
10.3 远程无法访问
现象:本地curl可以访问,但外部浏览器无法打开。
排查步骤:
- 检查安全组是否开放了对应的端口(80/443)。
- 检查服务器防火墙(firewalld/iptables/ufw)是否放行了端口。
- 检查Nginx是否监听在正确的IP地址上(0.0.0.0而非127.0.0.1)。
# CentOS/RHEL防火墙配置
firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --reload
# Ubuntu UFW防火墙配置
sudo ufw allow 'Nginx Full'
sudo ufw status10.4 动态库缺失
现象:启动时报错 "error while loading shared libraries: libpcre.so.1"。
解决方案:
ldconfig结语
至此,我们完整地走过了在阿里云Linux云服务器上搭建Nginx的全流程——从ECS实例的选型与安全组配置,到Nginx的安装与核心配置,再到虚拟主机、反向代理、负载均衡、HTTPS加密、性能优化、安全加固、日志管理以及Systemd进程守护。每一步都提供了可直接运行的命令和完整的配置示例。
Nginx的强大远不止于此——它还可以作为WebSocket代理、TCP/UDP负载均衡器、缓存服务器等。掌握本文的基础之后,你可以进一步探索Nginx的更多高级特性,结合阿里云生态中的负载均衡(SLB)、对象存储(OSS)、云监控(CloudMonitor)等产品,构建更加健壮、弹性的云原生Web架构。
最后提醒一点:在生产环境中部署任何更改之前,务必先在测试环境验证,并做好配置文件的备份。定期更新系统和Nginx版本,及时修复已知安全漏洞,是保障服务长期稳定运行的关键。
常见问题与解答
问1:Nginx和Apache应该选哪个?
答:Nginx采用事件驱动异步非阻塞架构,在高并发场景下内存占用更低、性能更好,尤其适合静态文件服务、反向代理和负载均衡。Apache采用多进程/多线程模型,模块丰富,兼容性好。静态内容为主或需要高并发的场景推荐Nginx,需要复杂.htaccess配置的传统应用可选择Apache。
问2:Nginx配置文件修改后如何生效?
答:修改配置文件后,先执行 nginx -t 检查语法是否正确,然后执行 systemctl reload nginx 平滑重载配置。reload 方式不会中断正在处理的请求,是最佳实践。
问3:阿里云免费SSL证书到期了怎么办?
答:阿里云个人测试证书有效期为90天,到期后不支持续费,需要重新申请。每个账号每年有20张免费额度,到期前重新申请并部署即可。也可以使用Let's Encrypt配合Certbot实现自动化申请和续期。
问4:Nginx如何实现动静分离?
答:在Nginx配置中,将静态资源(图片、CSS、JS等)的请求直接由Nginx处理(使用 root 或 alias 指定本地路径),将动态请求(如 .php、.jsp 或特定API路径)通过 proxy_pass 转发给后端应用服务器处理。
问5:如何查看Nginx的访问日志和错误日志?
答:访问日志默认位于 /var/log/nginx/access.log,错误日志位于 /var/log/nginx/error.log。可使用 tail -f /var/log/nginx/access.log 实时查看访问情况,或使用 grep、awk 等工具进行日志分析。
问6:Nginx源码编译和包管理器安装有什么区别?
答:包管理器安装简单快捷,自动处理依赖,适合大多数场景。源码编译安装更灵活,可以指定安装目录、按需启用或禁用模块、使用特定版本,适合需要定制化功能的进阶场景。




