阿里云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,用于提供加密Web服务。
安全组遵循"默认拒绝一切入流量"的设定,也就是说即便ECS实例已经绑定公网IP,只要你没有主动添加对应的端口放行规则,外部请求连TCP握手都完成不了。这是云上部署与物理机部署最大的区别之一,务必重视。
1.3 SSH连接与系统初始化
安全组配好后,通过SSH连接服务器:
ssh root@你的公网IP首次登录后,先做三件事:
第一,更新系统包。对于Alibaba Cloud Linux / CentOS / RHEL系统:
yum update -y对于Ubuntu / Debian系统:
apt update && apt upgrade -y第二,创建普通用户,避免长期使用root账户。以创建名为deploy的用户为例:
useradd deploy
passwd deploy第三,设置时区:
timedatectl set-timezone Asia/Shanghai第二章:Nginx安装与基础配置
2.1 安装方式选择:包管理器 vs 源码编译
Nginx的安装主要有两种方式:通过系统包管理器安装和通过源码编译安装。对于绝大多数场景,推荐使用包管理器安装——操作简单、升级方便、依赖自动处理。默认源的Nginx版本可能过旧,存在安全风险,建议添加Nginx官方源以安装最新的稳定版本。
方式一:包管理器安装(推荐)
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 nginxAlibaba Cloud Linux 2 / CentOS 7:
# 添加Nginx官方仓库
tee /etc/yum.repos.d/nginx.repo <<-'EOF'
[nginx-stable]
name=nginx stable repo
baseurl=https://nginx.org/packages/centos/7/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
EOF
# 安装Nginx
yum -y install nginxUbuntu 20.04 / 22.04:
# 更新包索引
apt update
# 安装Nginx
apt install -y nginx方式二:源码编译安装
源码编译安装适用于需要自定义编译模块、优化编译参数或使用特定版本的场景。虽然灵活性更高,但操作复杂,升级不便,一般不推荐作为生产环境的首选方式。
# 安装编译依赖
# CentOS / Alibaba Cloud Linux
yum install -y gcc gcc-c++ make pcre-devel zlib-devel openssl-devel
# Ubuntu / Debian
apt install -y build-essential libpcre3-dev zlib1g-dev libssl-dev
# 下载Nginx源码
wget https://nginx.org/download/nginx-1.26.0.tar.gz
tar -zxvf nginx-1.26.0.tar.gz
cd nginx-1.26.0
# 配置编译参数
./configure --prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_gzip_static_module \
--with-stream \
--with-stream_ssl_module
# 编译并安装
make && make install2.2 启动Nginx并验证
安装完成后,启动Nginx服务并设置开机自启:
# 启动Nginx
systemctl start nginx
# 设置开机自启
systemctl enable nginx
# 检查运行状态
systemctl status nginx验证安装是否成功:在浏览器中输入服务器的公网IP地址,应该能看到Nginx的欢迎页面。
2.3 配置文件结构解析
理解Nginx的配置文件结构是后续所有配置工作的基础:
- /etc/nginx/nginx.conf:主配置文件,包含全局设置和http块。
- /etc/nginx/conf.d/:存放额外的配置文件,推荐将每个站点的配置独立放在此目录下。
- /etc/nginx/sites-available/:存放每个站点的配置(Debian/Ubuntu风格)。
- /etc/nginx/sites-enabled/:存放指向sites-available中活跃站点的符号链接(Debian/Ubuntu风格)。
- /usr/share/nginx/html/:默认的文档根目录。
Nginx主配置文件nginx.conf的基本结构如下:
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
events {
worker_connections 1024;
}
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 4096;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}第三章:虚拟主机与多站点部署
3.1 创建虚拟主机配置文件
虚拟主机(Server Block)允许在同一台服务器上托管多个网站。首先在/etc/nginx/conf.d/目录下为每个站点创建独立的配置文件:
vim /etc/nginx/conf.d/example.com.conf一个基本的虚拟主机配置如下:
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;
}
}3.2 部署网站文件
创建文档根目录并设置权限:
mkdir -p /var/www/example.com/html
chown -R nginx:nginx /var/www/example.com/html
chmod -R 755 /var/www创建测试页面:
echo "<h1>Hello from example.com</h1>" > /var/www/example.com/html/index.html3.3 测试并重载配置
每次修改配置文件后,务必先测试语法是否正确:
nginx -t如果测试通过,重载Nginx使配置生效:
systemctl reload nginx第四章:反向代理与负载均衡
4.1 反向代理配置
反向代理是Nginx最核心的功能之一,它将客户端的请求转发到后端的应用服务器(如Tomcat、Node.js、Gunicorn等),然后将响应返回给客户端。反向代理隐藏了真实的内部IP地址,请求先访问Nginx代理服务器,Nginx再转发到真实服务器。
以下配置将所有以/api/开头的请求代理到本地的8080端口:
server {
listen 80;
server_name example.com;
location / {
root /var/www/example.com/html;
index index.html;
}
location /api/ {
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;
}
}4.2 负载均衡配置
Nginx通过upstream模块实现负载均衡,支持轮询、加权轮询、IP哈希、最少连接等多种算法。以下配置演示了一个简单的轮询负载均衡:
upstream backend {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}加权轮询配置(权重越高,分配到的请求越多):
upstream backend {
server 192.168.1.10:8080 weight=3;
server 192.168.1.11:8080 weight=2;
server 192.168.1.12:8080 weight=1;
}第五章:HTTPS加密配置
5.1 SSL证书的申请与准备
为网站配置HTTPS证书,不仅能够加密数据传输、保障用户隐私安全,还能提升网站的专业形象和SEO权重。阿里云数字证书管理服务提供多种类型的SSL证书:
- 个人测试证书(免费版):由DigiCert颁发,为DV(域名验证型)单域名证书。每个阿里云账号在一个自然年内可免费领取20张,有效期90天。适合个人博客、开发测试环境等非生产场景。
- 正式证书:包括DV、OV(组织验证型)、EV(扩展验证型)等多种级别,支持单域名、多域名和通配符域名,有效期通常为1年。
申请证书前需完成以下准备工作:
- 已完成阿里云账号的实名认证。
- 拥有一个已备案的域名(如服务器位于中国内地)。
- 域名已添加DNS解析记录,指向服务器的公网IP地址。
- 已在服务器安全组中放行443端口。
5.2 在Nginx中部署SSL证书
证书签发后,下载服务器类型为Nginx的证书,解压后得到证书文件(.pem或.crt)和私钥文件(.key)。将这两个文件上传至服务器,建议存放在/etc/ssl/cert/目录下。
编辑Nginx配置文件,添加443端口的server块:
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/ssl/cert/example.com.pem;
ssl_certificate_key /etc/ssl/cert/example.com.key;
# 仅支持高安全性的TLS协议
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
root /var/www/example.com/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
# HTTP自动跳转HTTPS
server {
listen 80;
server_name example.com;
return 301 https://$server_name$request_uri;
}配置完成后测试并重载Nginx:
nginx -t
systemctl reload nginx第六章:性能优化
6.1 操作系统内核参数调优
系统内核是服务器性能的基石,默认参数适配内网场景,完全不适合公网建站、高并发业务。修改核心参数可直接优化内存调度、TCP传输、并发连接能力。
文件描述符限制:Linux系统中,每个TCP连接都会占用一个文件描述符,默认值通常为1024,对于高并发场景远远不够。临时修改:
ulimit -n 100000永久修改需要编辑/etc/security/limits.conf文件:
* soft nofile 100000
* hard nofile 100000TCP/IP内核参数优化(/etc/sysctl.conf):
# 开启TCP SYN Cookie防护
net.ipv4.tcp_syncookies = 1
# 允许重用TIME_WAIT状态的连接
net.ipv4.tcp_tw_reuse = 1
# 缩短TIME_WAIT超时时间
net.ipv4.tcp_fin_timeout = 30
# 增大TCP发送和接收缓冲区
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# 启用BBR拥塞控制算法(Linux 4.9+)
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr执行以下命令使内核参数生效:
sysctl -p6.2 Nginx应用层参数调优
Nginx的worker进程数、连接数、事件模型等参数需要根据实际硬件资源和业务特征进行精细调优。
worker_processes:建议设置为CPU核心数,或使用auto自动检测。
worker_processes auto;worker_connections:每个worker进程允许的最大并发连接数,建议根据内存和业务量调整。
events {
worker_connections 10240;
use epoll;
}keepalive长连接:适当增加keepalive_timeout可以减少连接建立的开销。
keepalive_timeout 65;Gzip压缩:开启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 application/atom+xml image/svg+xml;静态资源缓存:为静态资源设置合理的缓存过期时间。
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}第七章:安全加固
7.1 系统防火墙配置
在阿里云安全组之外,系统层面还应配置防火墙作为第二道防线。对于使用firewalld的系统(CentOS / Alibaba Cloud Linux):
# 查看当前防火墙规则
firewall-cmd --list-all
# 开放80和443端口
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=443/tcp
# 重载防火墙
firewall-cmd --reload对于使用UFW的系统(Ubuntu):
ufw allow 'Nginx Full'
ufw status7.2 Nginx访问控制
使用allow和deny指令可以屏蔽恶意IP地址:
location / {
deny 192.168.1.100;
allow 192.168.1.0/24;
deny all;
}限制并发连接数和请求速率:
http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
limit_req_zone $binary_remote_addr zone=req:10m rate=10r/s;
server {
location / {
limit_conn addr 10;
limit_req zone=req burst=20 nodelay;
}
}
}7.3 隐藏Nginx版本信息
隐藏版本号可以减少针对特定版本漏洞的攻击:
server_tokens off;7.4 fail2ban防护
fail2ban可以自动封禁多次登录失败的IP地址,是SSH防护的重要工具。安装并配置fail2ban:
# 安装fail2ban
yum install -y fail2ban # CentOS / Alibaba Cloud Linux
apt install -y fail2ban # Ubuntu / Debian
# 启动并设置开机自启
systemctl start fail2ban
systemctl enable fail2ban第八章:日志管理与监控
8.1 日志配置
Nginx的访问日志和错误日志是排查问题的重要依据。在nginx.conf中配置日志格式:
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;
error_log /var/log/nginx/error.log;8.2 日志切割
使用logrotate工具自动切割和压缩日志文件,防止日志文件过大占满磁盘。系统通常已为Nginx配置了logrotate,配置文件位于/etc/logrotate.d/nginx。
第九章:进程守护与开机自启
9.1 Systemd管理
通过包管理器安装的Nginx会自动注册为Systemd服务。常用管理命令:
systemctl start nginx # 启动
systemctl stop nginx # 停止
systemctl restart nginx # 重启
systemctl reload nginx # 重载配置(不中断服务)
systemctl status nginx # 查看状态
systemctl enable nginx # 设置开机自启
systemctl disable nginx # 取消开机自启9.2 源码编译安装的进程管理
如果是源码编译安装,需要手动创建Systemd服务文件。创建/etc/systemd/system/nginx.service:
[Unit]
Description=nginx - high performance web server
Documentation=https://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
PrivateTmp=true
[Install]
WantedBy=multi-user.target然后执行:
systemctl daemon-reload
systemctl enable nginx
systemctl start nginx第十章:常见问题排查
10.1 网站打不开的排查思路
当部署完成后网站无法访问时,不要急于修改Nginx配置,而应按照以下层次逐步排查:
第一步:检查浏览器报错信息。如果看到ERR_CONNECTION_TIMED_OUT或ERR_CONNECTION_REFUSED,大概率是网络层的问题,而不是Nginx配置的问题。
第二步:使用telnet测试端口连通性。直接对公网IP执行telnet命令:
telnet 你的公网IP 80如果返回Unable to connect,立即去阿里云控制台检查安全组入方向是否添加了HTTP(80)规则。如果返回黑屏(连接成功),说明网络层、安全组都已放通,问题收缩到Nginx服务本身。
第三步:检查Nginx服务状态。
systemctl status nginx
netstat -tlnp | grep nginx确认Nginx是否监听在0.0.0.0:80,而非127.0.0.1。
10.2 配置文件语法错误
每次修改配置后务必执行测试:
nginx -t如果测试失败,Nginx会给出具体的错误行号和原因,根据提示修正即可。
结语
本文从零开始,完整记录了在阿里云Linux云服务器上搭建Nginx的全过程。从ECS实例的选购与初始化,到Nginx的安装、配置、虚拟主机部署、反向代理与负载均衡、HTTPS加密、性能优化、安全加固,再到日志管理与进程守护,覆盖了生产级部署的各个关键环节。希望这份指南能帮助你在阿里云ECS上快速构建一个高性能、安全可靠的Nginx Web服务环境。
在实际生产环境中,建议在部署前在隔离环境中测试所有更改,并备份所有关键数据和配置信息,以便在灾难恢复时能够迅速采取措施。保持系统和Nginx的定期更新,持续关注安全公告,是保障服务长期稳定运行的关键。
常见问题与解答
问1:在阿里云ECS上安装Nginx后,通过公网IP无法访问欢迎页面,该怎么办?
答:首先检查阿里云安全组是否放行了80端口。安全组是云服务器的第一道防火墙,默认拒绝所有入流量,必须手动添加入方向规则放行TCP 80端口。其次检查系统防火墙(firewalld或UFW)是否放行了80端口。最后确认Nginx服务是否正常运行,使用systemctl status nginx查看状态。
问2:Nginx的配置文件修改后如何生效?
答:修改配置文件后,先执行nginx -t测试语法是否正确。测试通过后,使用systemctl reload nginx重载配置,这种方式不会中断正在处理的连接,适合生产环境。如果配置有严重问题需要重启,可使用systemctl restart nginx。
问3:如何在同一台ECS上托管多个网站?
答:使用Nginx的虚拟主机(Server Block)功能。在/etc/nginx/conf.d/目录下为每个域名创建独立的.conf配置文件,每个文件中使用server块定义不同的server_name和root路径。配置完成后测试并重载Nginx即可。
问4:Nginx如何实现HTTPS?
答:首先需要申请SSL证书,阿里云提供免费的个人测试证书(DV类型,有效期90天)。证书签发后下载Nginx格式的证书文件(.pem和.key),上传到服务器指定目录。然后在Nginx配置中添加监听443端口的server块,配置ssl_certificate和ssl_certificate_key指向证书文件路径。建议同时配置80端口自动跳转HTTPS。
问5:Nginx的性能优化主要从哪些方面入手?
答:性能优化主要从两个层面入手。操作系统内核层面包括调整文件描述符限制、优化TCP/IP参数(如TIME_WAIT复用、SYN队列、TCP缓冲区、启用BBR拥塞控制算法等)。Nginx应用层面包括调整worker_processes(建议为CPU核心数)、worker_connections(根据内存调整)、开启Gzip压缩、设置静态资源缓存、调整keepalive超时时间等。
问6:源码编译安装Nginx和包管理器安装有什么区别?
答:包管理器安装操作简单、升级方便、依赖自动处理,是绝大多数场景的推荐方式。源码编译安装允许自定义编译模块、优化编译参数,灵活性更高,但操作复杂、升级不便,一般适用于需要特定模块或对性能有极致要求的场景。对于大多数用户,建议优先使用包管理器安装并添加Nginx官方源以获取最新稳定版本。



