- 操作系统: Ubuntu 22.04 LTS (Long Term Support,长期支持版,稳定可靠)
- Web 服务器: Nginx ( pronounced "Engine X",高性能、低内存消耗)
- 后端运行时: Node.js (用于构建动态网站和 API)
- 数据库: MySQL (关系型数据库,存储网站数据)
- 前端: Nginx 直接提供静态文件服务
第一部分:准备工作
在开始之前,你需要准备以下两样东西:
- 一台云服务器: 你可以从阿里云、腾讯云、AWS、DigitalOcean 等服务商购买一台,推荐选择 Ubuntu 22.04 系统,配置建议至少 1核CPU/2GB内存。
- 一个域名: 虽然不是必须,但拥有一个域名可以让你的网站更容易被访问和记忆,你需要在域名服务商处购买,并将服务器的 IP 地址指向你的域名(这个过程叫做 DNS 解析)。
第二部分:服务器环境配置
步骤 1: 连接到你的服务器
使用 SSH(Secure Shell)工具连接到你的服务器,在 macOS 或 Linux 的终端中,或者在 Windows 的 PowerShell/命令提示符中,运行以下命令:
# 将 your_server_ip 替换为你的服务器公网 IP 地址 ssh root@your_server_ip
首次连接时,系统会提示你确认服务器的指纹,输入 yes 即可,之后会要求输入你购买服务器时设置的 root 密码。
步骤 2: 更新系统并创建新用户
为了安全性和最佳实践,我们不应该直接使用 root 用户进行日常操作。
# 1. 更新系统软件包列表 sudo apt update # 2. 升级已安装的软件包 sudo apt upgrade -y # 3. 创建一个新用户,这里我们创建一个名为 'webadmin' 的用户 sudo adduser webadmin # 4. 为新用户赋予管理员权限 (sudo) sudo usermod -aG sudo webadmin
退出当前 SSH 连接,然后用新创建的用户重新登录:
# 退出 exit # 用新用户登录 ssh webadmin@your_server_ip
步骤 3: 配置防火墙
为了服务器的安全,我们需要只开放必要的端口(如 HTTP 80, HTTPS 443, SSH 22)。
# 安装 UFW (Uncomplicated Firewall) sudo apt install ufw -y # 允许 SSH 连接 (非常重要,防止你把自己锁在外面) sudo ufw allow OpenSSH # 允许 HTTP 流量 (用于网站访问) sudo ufw allow 'Nginx Full' # 启用防火墙 sudo ufw enable # 系统会提示你确认,输入 y 并回车
步骤 4: 安装 Nginx
Nginx 是一个轻量级、高性能的 Web 服务器和反向代理服务器。
# 安装 Nginx sudo apt install nginx -y # 安装完成后,启动 Nginx 服务并设置为开机自启 sudo systemctl start nginx sudo systemctl enable nginx
验证 Nginx 是否运行成功:
在浏览器中输入你的服务器 IP 地址 http://your_server_ip,如果看到 "Welcome to nginx!" 页面,说明 Nginx 已经成功运行。
第三部分:安装和配置后端与数据库
我们将搭建一个简单的 Node.js 应用,它从 MySQL 数据库中读取数据并通过 Nginx 提供服务。
步骤 5: 安装 Node.js 和 npm
# 使用 NodeSource 仓库安装最新的 LTS 版本 (以 Node.js 20.x 为例) curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - sudo apt-get install -y nodejs # 验证安装 node -v npm -v
步骤 6: 安装 MySQL
# 安装 MySQL 服务器 sudo apt install mysql-server -y # 运行安全脚本,它会设置 root 密码、移除匿名用户等 sudo mysql_secure_installation
在 mysql_secure_installation 的交互式过程中,建议:
- 为 root 用户设置一个强密码。
- 对于其他选项(如移除匿名用户、禁止 root 远程登录等),直接按
Y(是) 回车即可,这是安全最佳实践。
步骤 7: 创建数据库和用户
# 登录 MySQL sudo mysql -u root -p # 输入你刚才设置的 root 密码 # 在 MySQL 命令行中执行以下 SQL 语句 CREATE DATABASE my_website_db; CREATE USER 'webuser'@'localhost' IDENTIFIED BY 'your_strong_password'; GRANT ALL PRIVILEGES ON my_website_db.* TO 'webuser'@'localhost'; FLUSH PRIVILEGES; EXIT;
请务必将 your_strong_password 替换为一个你自己的、非常安全的密码。
第四部分:部署你的网站
步骤 8: 创建项目目录并上传代码
我们将网站代码存放在 /var/www 目录下,这是 Web 服务器的标准根目录。
# 创建项目目录 sudo mkdir -p /var/www/my-website # 将目录所有权赋予当前用户 sudo chown -R $USER:$USER /var/www/my-website # 进入项目目录 cd /var/www/my-website
你需要将你的网站代码上传到这个目录,你可以使用:
- Git: 如果你的代码托管在 GitHub/GitLab 上,直接
git clone。 - SFTP/SCP: 使用 FileZilla 等工具,或通过
scp命令从本地电脑上传。
为了演示,我们创建一个最简单的 Node.js 应用。
创建 app.js 文件:
nano app.js
将以下代码粘贴进去,然后按 Ctrl+X,Y,Enter 保存。
const http = require('http');
const mysql = require('mysql2/promise');
// 创建数据库连接池
const pool = mysql.createPool({
host: 'localhost',
user: 'webuser',
password: 'your_strong_password', // <-- 这里填你设置的密码
database: 'my_website_db',
waitForConnections: true,
connectionLimit: 10,
queueLimit: 0
});
const server = http.createServer(async (req, res) => {
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
try {
const [rows] = await pool.query('SELECT message FROM greetings LIMIT 1');
const message = rows[0].message;
res.end(`
<html>
<head><title>我的网站</title></head>
<body>
<h1>欢迎来到我的网站!</h1>
<p>从数据库获取到的消息是: <strong>${message}</strong></p>
</body>
</html>
`);
} catch (error) {
res.end('<h1>数据库连接错误</h1><p>' + error.message + '</p>');
}
});
const PORT = 3000;
server.listen(PORT, () => {
console.log(`Server is running on http://localhost:${PORT}`);
});
创建 package.json 文件:
nano package.json
{
"name": "my-website",
"version": "1.0.0",
"description": "A simple website on Nginx and Node.js",
"main": "app.js",
"scripts": {
"start": "node app.js"
},
"dependencies": {
"mysql2": "^3.6.3"
}
}
安装依赖:
npm install
步骤 9: 配置 Nginx 反向代理
我们需要配置 Nginx,让它将来自外部的请求(如 http://your_domain.com)转发到我们 Node.js 应用运行的 3000 端口。
# 创建一个新的 Nginx 配置文件 sudo nano /etc/nginx/sites-available/my-website
粘贴进去。请务必将 your_domain.com 替换为你的真实域名。
server {
listen 80;
server_name your_domain.com www.your_domain.com;
root /var/www/my-website;
index index.html index.htm;
location / {
# 将请求转发到 Node.js 应用
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
保存文件后,启用这个配置站点:
# 创建一个指向 sites-enabled 目录的符号链接 sudo ln -s /etc/nginx/sites-available/my-website /etc/nginx/sites-enabled/ # 为了安全,删除默认的配置文件 sudo rm /etc/nginx/sites-enabled/default # 测试 Nginx 配置是否正确 sudo nginx -t # 如果测试成功,会显示 "syntax is ok" 和 "test is successful" # 然后重新加载 Nginx 使配置生效 sudo systemctl reload nginx
步骤 10: 使用 PM2 管理你的 Node.js 应用
为了让你的 Node.js 应用在后台稳定运行,并在服务器重启后自动启动,我们使用 PM2 这个进程管理器。
# 全局安装 PM2 sudo npm install pm2 -g # 在你的项目目录下,启动应用 pm2 start app.js --name "my-website" # 查看应用状态 pm2 status # 设置 PM2 开机自启 pm2 startup # PM2 会提示你运行一个命令,复制并执行它即可
步骤 11: 配置域名解析
登录你的域名服务商后台,找到 DNS 解析设置,添加两条 A 记录:
- 记录类型:
A - 主机记录: (代表主域名)
- 记录值:
你的服务器 IP 地址 - 记录类型:
A - 主机记录:
www(代表带 www 的域名) - 记录值:
你的服务器 IP 地址
等待几分钟到几小时(DNS 生效需要时间),然后在浏览器中访问你的域名 http://your_domain.com。
如果一切顺利,你应该能看到你 Node.js 应用渲染的页面,并且显示了从 MySQL 数据库中读取的消息!
恭喜!你已经成功地在 Linux 服务器上搭建了一个完整的网站服务环境,这个流程涵盖了:
- 服务器基础: 安全登录、更新系统、配置防火墙。
- Web 服务器: 安装并配置 Nginx,使其能够提供静态文件和反向代理。
- 后端与数据库: 安装 Node.js 和 MySQL,并创建了数据库和用户。
- 应用部署: 将代码上传服务器,使用 PM2 保证应用持续运行。
- 域名集成: 通过 DNS 解析,让你的域名指向服务器。
这是一个非常坚实的基础,你可以基于这个环境,继续部署更复杂的网站、配置 HTTPS (使用 Let's Encrypt)、添加更多的安全措施等。
