从拿到 IP 到网站能访问:我的真实踩坑经历
说实话,第一次买服务器的时候,我连 SSH 是什么都不知道。看着手里那串 IP 地址,心里既兴奋又发慌——钱都花了,万一搞砸了怎么办?后来我买了一台阿里云的ecs.t6-c1m1.small,配的是腾讯云也差不多,Linux 初学者最容易懵的其实是第一步连接和第二步环境配置。
今天这篇,我想用一种比较”人话”的方式,带你走完整个流程。不是那种冷冰冰的官方文档,而是我一个过来人踩过的坑、犯过的错、最终搞定之后的成就感。
一、首次登录:别被 SSH 吓到
1.1 为什么一定要用终端?
服务器是一台”没有屏幕”的电脑。你买回来之后,它运行在远方的机房里,你只能通过命令行来操作它。这听起来很吓人,但其实只要你掌握几个命令,就能像操控自己的电脑一样操控它。
1.2 Mac / Linux 用户:开箱即用
如果你用的是 Mac 或 Linux,系统自带终端,直接打开 Terminal,输入:
ssh root@你的服务器公网IP
比如你的 IP 是 43.138.123.45,那就输入:
ssh root@43.138.123.45
然后系统会问你:
The authenticity of host '43.138.123.45' can't be established.
ED25519 key fingerprint is SHA256:xxxxxxxx
Are you sure you want to continue connecting (yes/no/[fingerprint])?
输入 yes 回车即可。接下来会让你输入密码——注意:密码输入时屏幕上不会显示任何字符,这是正常的,别以为键盘坏了,输完直接回车就行。
⚠️ 重要提示:首次登录建议立刻修改 root 密码,默认密码通常是一串随机生成的,不安全。
1.3 Windows 用户:两个选择
方式一:使用 PuTTY(传统但稳定)
- 下载 PuTTY:https://www.putty.org/
- 打开后在 “Host Name” 填入你的服务器 IP
- Port 保持
22 - 点击 “Open”
- 登录时用户名输入
root,密码填入你重置后的 root 密码
方式二:使用 Windows Terminal + SSH(更现代)
Windows 10⁄11 已经内置了 OpenSSH 客户端。打开 Windows Terminal 或 PowerShell,直接输入:
ssh root@43.138.123.45
和 Mac 体验几乎一样,推荐这个方法。
1.4 常见问题:Connection refused
ssh: connect to host 43.138.123.45 port 22: Connection refused
这个错误通常意味着防火墙拦截了 22 端口。解决方法:
- 登录云服务商控制台(阿里云/腾讯云)
- 找到你的实例 → 安全组 → 入方向规则
- 添加一条规则:端口范围
22,授权对象0.0.0.0/0,协议选择TCP - 保存后重试 SSH 连接
二、系统初始化:别让裸机继续裸着
登录成功后,你会看到一个黑底白字的界面,提示符是 #。这时候你的系统还什么都没有,我们来一步步把它”装修”好。
2.1 修改 root 密码(如果还是默认的)
passwd root
系统会提示你输入新密码并确认。再次提醒:输入时不显示字符,输完回车。
2.2 创建普通用户(强烈建议)
直接用 root 登录有很多风险,一旦误操作或者被攻破,后果很严重。我们要创建一个普通用户来日常操作。
# 创建用户 zhangsan
useradd zhangsan
# 设置密码
passwd zhangsan
# 赋予 sudo 权限(让普通用户能执行管理员命令)
# 先检查是否安装了 sudo
which sudo
# 如果没安装,执行以下命令安装
yum install sudo -y
# 将用户加入 wheel 组(wheel 组默认拥有 sudo 权限)
usermod -aG wheel zhangsan
验证是否成功:
su - zhangsan
sudo whoami
# 应该输出 root
2.3 配置 SSH 密钥登录(提升安全性)
密码登录容易被暴力破解,改用密钥登录更安全也更方便。
在本地电脑生成密钥对:
Mac/Linux:
ssh-keygen -t ed25519 -C "your_email@example.com"
Windows(PowerShell):
ssh-keygen -t ed25519 -C "your_email@example.com"
一路回车即可,密钥默认保存在 ~/.ssh/id_ed25519。
将公钥复制到服务器:
# 在本地执行,替换 IP 为你的服务器 IP
ssh-copy-id root@43.138.123.45
如果提示找不到 ssh-copy-id(Windows 常见),可以手动复制:
# 先在本地查看公钥内容
cat ~/.ssh/id_ed25519.pub
# 然后 SSH 登录服务器,手动添加到authorized_keys
mkdir -p ~/.ssh
echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIxxxxxxxxxxxxxxxxxxxxxxxxxxxxx your_email@example.com" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh
测试密钥登录:
新开一个终端窗口,尝试登录:
ssh root@43.138.123.45
如果直接进去了不需要密码,说明配置成功。
2.4 禁用密码登录 + 禁止 root 远程登录
这是安全加固的关键一步,做完之后只有密钥能登录,而且不能用 root 直接从远程登录,必须先用普通用户登录再 sudo su。
编辑 SSH 配置文件:
vi /etc/ssh/sshd_config
如果不会用 vi,可以先用 nano(如果已安装),或者用以下命令快速修改:
# 备份原配置
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
# 修改关键参数
sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config
sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
sed -i 's/#PubkeyAuthentication yes/PubkeyAuthentication yes/' /etc/ssh/sshd_config
重启 SSH 服务使配置生效:
systemctl restart sshd
⚠️ 危险操作警告:修改完以上配置后,千万不要直接断开当前终端!先开一个新终端窗口测试能否通过密钥登录。如果连不上,你就被锁在外面了,只能通过云服务商的”远程连接”(VNC)控制台来修复。
三、安装 AlmaLinux 8 系统(如果初始镜像不是)
如果你购买服务器时选择的是 CentOS 7、Ubuntu 或其他镜像,想换成 AlmaLinux 8,有几种方式:
方式一:重装系统(最简单)
在阿里云/腾讯云控制台找到你的实例,点击 “重装系统”,选择 AlmaLinux 8.8 或最新稳定版,等待几分钟后重新连接。
方式二:在现有系统上迁移(适合数据已存在的情况)
# 更新系统
yum update -y
# 安装 EPEL 仓库
yum install epel-release -y
# 安装 AlmaLinux 迁移工具
yum install almalinux-release -y
# 迁移(此操作不可逆,建议先备份)
/bin/alma-migrate --skip-release-naming-checks
推荐还是直接用重装系统的方式,干净利落,避免后续一堆兼容性问题。
四、搭建 Web 服务器:LNMP 环境详解
Web 服务器通常指的是 Nginx + MySQL/MariaDB + PHP,也就是 LNMP 架构。AlmaLinux 8 自带 MariaDB(MySQL 的分支)和 PHP 8.0/8.1,安装起来比 CentOS 7 友好很多。
4.1 安装 Nginx
# 安装 EPEL 仓库(一些额外的软件包)
yum install epel-release -y
# 安装 Nginx
yum install nginx -y
# 启动 Nginx 并设置开机自启
systemctl start nginx
systemctl enable nginx
# 查看 Nginx 状态
systemctl status nginx
打开浏览器访问 http://你的服务器IP,如果看到 “Welcome to nginx on AlmaLinux” 或类似页面,说明安装成功。
4.2 配置防火墙(Nginx 通过 HTTP/HTTPS 端口)
# 查看防火墙状态
firewall-cmd --state
# 开放 HTTP (80) 和 HTTPS (443) 端口
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
# 重新加载防火墙规则
firewall-cmd --reload
# 验证端口是否开放
firewall-cmd --list-ports
4.3 安装 MariaDB(替代 MySQL)
# 安装 MariaDB
yum install mariadb-server mariadb -y
# 启动并设置开机自启
systemctl start mariadb
systemctl enable mariadb
# 安全初始化(设置 root 密码、删除匿名用户等)
mysql_secure_installation
执行 mysql_secure_installation 后会有几个选项,建议:
- 设置 root 密码:输入你想设置的密码
- Remove anonymous users:选
Y - Disallow root login remotely:选
Y - Remove test database:选
Y - Reload privilege tables:选
Y
4.4 安装 PHP 8.1(AlmaLinux 8 默认源可能只有 PHP 8.0)
AlmaLinux 8 的基础仓库包含 PHP 8.0,但如果你想要更新的 PHP 8.1:
# 安装 Remi 仓库(提供新版 PHP)
yum install https://rpms.remirepo.net/enterprise/remi-release-8.rpm -y
# 启用 Remi 的 PHP 8.1 模块
yum module reset php -y
yum module enable php:remi-8.1 -y
# 安装 PHP 及常用扩展
yum install php php-fpm php-mysqlnd php-gD php-mbstring php-xml php-curl php-json php-zip -y
# 启动 PHP-FPM
systemctl start php-fpm
systemctl enable php-fpm
验证 PHP 版本:
php -v
# 应该显示 PHP 8.1.x
4.5 配置 Nginx 支持 PHP
默认情况下 Nginx 不懂如何处理 PHP 文件,需要修改配置让它通过 PHP-FPM 来解析。
# 编辑 Nginx 默认配置文件
vi /etc/nginx/conf.d/default.conf
将 server 块的内容修改为:
server {
listen 80;
listen [::]:80;
server_name _;
root /usr/share/nginx/html;
index index.php index.html index.htm;
# 支持 PHP 文件解析
location / {
try_files $uri $uri/ =404;
}
# PHP 处理配置
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# 禁止访问隐藏文件
location ~ /\. {
deny all;
}
}
测试 Nginx 配置是否正确:
nginx -t
# 应该输出:nginx: configuration file /etc/nginx/nginx.conf test is successful
重载 Nginx 使配置生效:
systemctl reload nginx
4.6 测试 PHP 是否工作
创建一个测试文件:
cat > /usr/share/nginx/html/info.php << 'EOF'
<?php
phpinfo();
?>
EOF
打开浏览器访问 http://你的服务器IP/info.php,如果看到一个详细的 PHP 信息页面,说明 Nginx + PHP-FPM 配置成功。
五、部署你的第一个网站
5.1 上传网站文件
有几种方式:
方式一:用 scp 从本地上传
# 在本地电脑执行
scp -r /本地网站路径/* root@43.138.123.45:/usr/share/nginx/html/
方式二:用 rsync(适合大文件)
rsync -avz /本地网站路径/ root@43.138.123.45:/usr/share/nginx/html/
方式三:直接用 Git 拉取(推荐)
如果你的网站代码在 GitHub/GitLab 上:
# 安装 git
yum install git -y
# 克隆项目到网站目录
cd /usr/share/nginx/html
git clone https://github.com/你的用户名/你的项目.git .
5.2 设置目录权限
# 设置 Nginx 用户拥有网站目录权限
chown -R nginx:nginx /usr/share/nginx/html
chmod -R 755 /usr/share/nginx/html
5.3 如果你要部署 WordPress
# 创建数据库和用户
mysql -u root -p
进入 MySQL 后执行:
CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'wpuser'@'localhost' IDENTIFIED BY '你的强密码';
GRANT ALL PRIVILEGES ON wordpress.* TO 'wpuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;
# 下载 WordPress
cd /usr/share/nginx/html
wget https://wordpress.org/latest.tar.gz
tar -xzf latest.tar.gz
mv wordpress/* .
rm -rf wordpress latest.tar.gz
# 设置权限
chown -R nginx:nginx /usr/share/nginx/html
然后通过浏览器访问 http://你的服务器IP/wp-admin/install.php,按提示完成 WordPress 安装。
六、HTTPS 证书配置(Let’s Encrypt 免费证书)
网站没有 HTTPS 会被浏览器标记为”不安全”,严重影响体验。我们用 Certbot 来申请免费的 Let’s Encrypt 证书。
# 安装 Certbot 和 Nginx 插件
yum install certbot certbot-nginx -y
# 申请证书(需要你的域名已解析到服务器 IP)
certbot --nginx -d yourdomain.com -d www.yourdomain.com
按照提示输入邮箱、同意条款即可。Certbot 会自动:
- 申请证书
- 修改 Nginx 配置启用 HTTPS
- 设置自动续期
验证是否生效:
# 查看证书到期时间
certbot certificates
七、常见报错及解决方案
7.1 Nginx 报 502 Bad Gateway
502 Bad Gateway
nginx/1.20.1
原因:PHP-FPM 没有正确运行,或者 Nginx 配置的 fastcgi_pass 地址不对。
排查步骤:
# 查看 PHP-FPM 状态
systemctl status php-fpm
# 查看 PHP-FPM 错误日志
tail -f /var/log/php-fpm/error.log
# 检查 Nginx 错误日志
tail -f /var/log/nginx/error.log
常见修复:
- 确认
php-fpm正在运行:systemctl start php-fpm - 确认
fastcgi_pass配置正确(默认是127.0.0.1:9000) - 检查
listen指令在/etc/php-fpm.d/www.conf中是listen = 127.0.0.1:9000而非listen = /run/php-fpm/www.sock
7.2 PHP 文件直接下载而不执行
原因:Nginx 没有配置 PHP 解析,或者配置文件语法错误。
排查:
# 检查 Nginx 配置语法
nginx -t
# 检查配置文件中的 location ~ \.php$ 块是否存在
grep -n "fastcgi" /etc/nginx/conf.d/default.conf
7.3 MySQL 连接失败:Access denied for user ‘root’@‘localhost’
原因:MySQL 8.0+ 默认使用 caching_sha2_password 认证插件,老版本客户端可能不支持。
修复:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码';
FLUSH PRIVILEGES;
7.4 防火墙阻止了 80⁄443 端口,网站打不开
”`bash
检查防火墙状态
firewall-cmd –state
查看已开放的端口
firewall-cmd –list-ports
开放 80 和 443
firewall-cmd –permanent –add-port=80/tcp firewall-cmd –permanent
