最近入手了一台HoRain云的云服务器,想着把手上几个小项目都挂上去。第一步就是通过Xshell远程连接Linux,再把Nginx装起来。说实话,这俩操作对老手来说就是几分钟的事,但对刚入门的同学,坑还真不少:Xshell连不上、Nginx启动失败、浏览器访问超时……我这些天全碰了一遍。这篇就把从连接Linux到安装Nginx的完整流程、踩坑记录、几个靠谱的避坑方法都写出来,希望能帮你少走弯路。如果手头正好有一台云服务器,或者正打算从零开始部署,这份实操笔记可以直接照着做。
1. 动手前想清楚的三件事
1.1 为什么是云服务器加本机终端这套组合
服务器放在机房,没有显示器也没有键盘鼠标,你要想操作它,最常用的方式就是通过SSH协议从自己电脑远程连过去,然后敲命令。Xshell是Windows下一款非常成熟的SSH客户端,标签式会话、历史命令、文件传输这些功能都很顺手,个人使用有免费授权,所以我一直把它当作远程连接Linux的首选工具。至于HoRain云,我选它主要是看中后台操作简单、资源定价透明,新用户上手几乎没有门槛。
有了云服务器和Xshell之后,目标就非常明确:本地Windows上用Xshell远程连到Linux,然后在Linux里把Nginx跑起来,最终通过浏览器访问到Nginx欢迎页。这个链路一旦打通,你后续不管是部署网站、做反向代理,还是跑各种服务,都能复用同一套方法。
1.2 登录服务器前必须要拿到的三样信息
云服务器虽然已经开机,但你不能像打开本地电脑一样直接进去。需要先确认三样东西:公网IP地址、登录用户名、登录密码或密钥。
公网IP在HoRain云控制台的实例列表里能看到,是一串类似 1.2.3.4 的IPv4地址,也有可能是IPv6。登录用户名大多数发行版默认是root,如果用Ubuntu,有时默认用户叫ubuntu或者直接用密钥登录。密码是创建实例时设置的,如果用密钥登录,要在控制台提前绑定好私钥文件,Xshell连接时需要指定对应的私钥。
如果你把密码忘了,不用慌,云平台基本都支持在控制台重置实例密码,重置完记得重启服务器。拿到这三样信息后,就可以开始连接了。
注意:我遇到过不少朋友,拿到服务器之后直接在Xshell里填了一个内网IP,结果怎么都连不上。云服务器上填的一定是公网IP,不是私网IP,这个最容易搞混。
2. 用Xshell连接Linux服务器的完整过程
2.1 下载安装Xshell时的常见纠结
Xshell的下载页面很容易让人看迷糊,因为它既有家庭版,也有评估版,官网还时不时改版。最省事的方法是访问官方站点,找到“Home / Home & School Use”入口,填一下姓名和邮箱,官方会把下载链接发到你邮箱。这个版本对个人、学生、教师免费使用,但注意不要用于商业场景。下载完安装时一路Next就行,如果Windows SmartScreen弹出警告,选择“仍要运行”即可。
还有一个特别常见的问题:Xshell 7提示许可过期。这个情况多半是用了商业评估期限,或者系统时间不对。我的建议是个人用户直接装官网个人免费版,没有必要折腾其他版本。如果你希望在Xshell里看到更舒服的中文字体,可以在菜单“工具—选项—外观”里把默认字体改成微软雅黑,字号调到14左右,连接后的界面会清爽很多。
2.2 新建会话:从IP到密钥的一步步操作
打开Xshell后,点“新建”会弹出会话属性窗口。名称随便填,比如“我的HoRain云”;主机填公网IP;协议保持SSH,端口号22。确认无误后点“连接”,首次连接会弹出“SSH主机密钥确认”提示,这是正常现象,选择“接受并保存”即可。
接着输入用户名root,按回车后输入密码。这里有个体验很好的细节:Xshell会询问是否记住用户名和密码。个人电脑上可以记住,如果是公用电脑,建议不要勾选,避免密码泄露。登录成功后,你会看到命令提示符,类似[root@your-hostname ~]#,这说明你已经成功进入Linux系统了。
如果你使用的是SSH密钥登录,在连接前需要到“会话属性—用户身份验证—方法”里选择Public Key,并浏览选择私钥文件。之后的流程和密码登录差不多。
2.3 连接成功后先做一次体检
连上之后不要急着装Nginx,先搞清楚手里这台机器是什么系统。执行uname -a可以看内核版本;执行cat /etc/os-release可以看到发行版名称和版本号,比如CentOS Stream、Ubuntu 22.04、Debian 12。这一步很重要,因为后面安装Nginx使用的命令完全不同。
另外用whoami确认当前用户,用pwd查看所在目录。如果登录用户不是root,比如是ubuntu用户,后面很多命令需要加sudo。为了省事,我通常会先执行sudo -i切到root,再继续操作。
3. 安装前必须了解的几个Linux基础
3.1 软件源决定你能不能装上Nginx
Linux安装软件主要靠包管理器。CentOS/RHEL用yum或dnf,Ubuntu/Debian用apt,包管理器会从一个配置好的软件源仓库里下载软件包。Nginx在官方源里虽然有,但有些系统默认源里没有,比如CentOS的最小安装可能找不到nginx包。
遇到找不到包的情况,先更新源再重试;若还是不行,就要考虑启用EPEL扩展源;Ubuntu系统则可以先运行apt update刷新索引。理解这一点,你才能真正淡定应对各种“No package nginx available”的报错。软件源原理并不复杂,你可以把它理解成一个应用商店,商店里有没有这个软件,决定了你能否直接安装成功。
3.2 常用命令先练熟,后面才能不慌
虽然今天只是装个Nginx,但你会发现,Linux下干活离不开几条基础命令:
cd:切换目录,比如cd /etc/nginxls:列出文件,ls -la可以看隐藏文件和权限cat:查看文件内容,比如cat /etc/nginx/nginx.confvim:编辑文件,按i进入编辑,按Esc后输入:wq保存退出systemctl:管理服务,比如systemctl enable nginxcurl:测试访问本地或远程地址ps、ss、netstat:查看进程和端口tail:查看日志,比如tail -f /var/log/nginx/error.log
这些命令不用死记,多用几次就记住了。你需要建立一个基本概念:运行中的服务是进程,Nginx就是监听80端口的进程。修改Nginx配置后,通常执行reload而不是restart,这样可以让Nginx平滑加载新配置,不中断现有连接。
3.3 中文乱码和Vim编辑器的坑
Xshell连接后如果看到中文乱码,大概率是客户端编码和服务器编码不一致。解决方法是:在Xshell的“文件—属性—终端—编码”里改成UTF-8,必要时服务器端执行export LANG=zh_CN.UTF-8。
另外,在Linux里编辑文件时会发现鼠标复制粘贴不好使,Vim里右键粘贴会在内容前面多出一堆缩进,这是Vim自动缩进导致的。我习惯编辑前先按:set paste再粘贴,或者干脆在Windows记事本里把内容写好,然后通过cat > /etc/nginx/conf.d/test.conf的方式粘贴进去,最后按Ctrl+D结束。这个方法对新手特别友好,能省去很多Vim操作上的麻烦。
4. 安装Nginx的两种可靠姿势
4.1 方法一:用系统包管理器快速安装
如果你是第一次装Nginx,我强烈建议用包管理器安装,简单、可控、卸载也干净。下面是不同系统的命令。
Ubuntu/Debian:
sudo apt update sudo apt install nginx -yCentOS/RHEL:
sudo yum install epel-release -y sudo yum install nginx -y安装完成后,可以用nginx -v查看版本。如果系统里没有nginx命令,检查一下PATH,或者重新安装。包管理器安装的Nginx,目录布局非常规范:主配置在/etc/nginx/nginx.conf,站点配置在/etc/nginx/conf.d/,默认网页根目录是/usr/share/nginx/html,日志在/var/log/nginx/。
用systemd管理也是最顺手的:systemctl start nginx启动,systemctl enable nginx设置开机自启。这套方式的好处是,后续排查问题时,网上搜到的经验基本都能直接用上。我自己的个人项目基本都用这种方式,省心。
4.2 方法二:源码编译安装,满足定制需求
如果你需要特定模块,比如第三方模块、新版TLS或HTTP/3支持,或者系统包管理器里的版本太旧,那就走源码编译。整个过程不算复杂,但有几个关键点。先安装编译依赖,以CentOS为例:
sudo yum install gcc make pcre-devel zlib-devel openssl-devel -yUbuntu的话,依赖略有不同:
sudo apt install build-essential libpcre3-dev zlib1g-dev libssl-dev -y然后下载Nginx源码并解压:
wget https://nginx.org/download/nginx-1.24.0.tar.gz tar -zxvf nginx-1.24.0.tar.gz cd nginx-1.24.0配置编译参数时,按需选择模块:
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_v2_module make -j2 sudo make install编译安装完成后,Nginx被装在/usr/local/nginx,启动得用/usr/local/nginx/sbin/nginx。这种方式的缺点也很明显:没有集成到systemd里,需要自己写service文件;后续卸载也不方便。所以我只在有明确定制需求时才会选源码编译。若只是搭个网站或做反向代理,包管理器版本足够用了。
4.3 两种安装方式怎么选
| 对比项 | 包管理器安装 | 源码编译安装 |
|---|---|---|
| 安装难度 | 低,一条命令 | 较高,依赖工具多 |
| 版本新旧 | 取决于系统源 | 可自定义 |
| 目录规范 | 符合系统默认约定 | 集中在自定义路径 |
| 管理方式 | systemd直接管理 | 手动或自己写service |
| 适用场景 | 绝大多数新手和常规部署 | 需要定制模块、特殊参数 |
如果你已经在这一步卡住了,常见问题一般是依赖装不全,或者wget下载太慢。源码编译时的configure报错信息一定要仔细看,它会明确告诉你缺哪个库。比如报出“the HTTP rewrite module requires the PCRE library”,那就说明你没装pcre-devel,装上再重新configure即可。源码编译就是这么朴实无华,缺什么补什么。
5. 启动Nginx:从本地验证到公网访问
5.1 用systemd把服务拉起来
以包管理器安装的Nginx为例,安装完成后先测试配置是否合法。执行nginx -t,一般会输出syntax is ok和test is successful。然后启动服务:
sudo systemctl start nginx sudo systemctl enable nginx sudo systemctl status nginx如果status里显示active (running),说明启动成功。此时可以在服务器上执行curl http://127.0.0.1,如果返回一段HTML,里面带有“Welcome to nginx”字样,说明Nginx已经在正常工作。这一步本地自测很有价值,它能帮你区分“服务本身有问题”和“公网访问路径有问题”。
5.2 防火墙和云控制台安全组,缺一不可
服务已经起来了,但浏览器还是打不开公网IP,这种情况十有八九是防火墙或者云平台安全组没放行。这里要分两层检查。
第一层是操作系统防火墙。CentOS默认启用firewalld,Ubuntu一般用ufw。如果是firewalld,执行:
sudo systemctl status firewalld sudo firewall-cmd --add-service=http --permanent sudo firewall-cmd --reload如果是ufw,执行sudo ufw allow 80/tcp。
第二层是云控制台安全组。HoRain云在创建实例后,缺省安全组通常只放行了22端口,需要在控制台的安全组里添加一条入方向规则:协议TCP,端口80,来源可以填0.0.0.0/0,这样所有公网IP都能访问。调整后记得保存。
注意:很多刚上云的朋友只检查了系统防火墙,没想到安全组这一层。结果在服务器上curl正常,浏览器却超时,多半就是这个原因。
5.3 用浏览器访问才算成功
配置完成后,在本地浏览器地址栏输入http://你的公网IP,如果能看到Nginx的欢迎页,恭喜你,整个链路已经通了。如果访问不了,按顺序排查:先确定本地能ping通服务器(有的云服务器默认禁ping除外),再看服务器上80端口是否监听,再看防火墙,最后看安全组。也可以让朋友用手机流量访问试试,这能排除你本地浏览器缓存等因素的影响。
6. 配置Nginx:别只停在欢迎页
6.1 主配置和站点配置的结构
包管理器安装的Nginx,配置逻辑很清晰。主配置/etc/nginx/nginx.conf里会加载/etc/nginx/conf.d/*.conf,或者/etc/nginx/sites-enabled/下的文件。最佳实践是不要直接改主配置,而是新建一个站点文件。
例如,我想让Nginx托管/var/www/myblog目录下的静态文件,可以这样写站点配置:
server { listen 80; server_name myblog.example.com; # 更改为你的域名或IP root /var/www/myblog; index index.html; location / { try_files $uri $uri/ =404; } }保存到/etc/nginx/conf.d/myblog.conf,然后执行nginx -t检查语法,再systemctl reload nginx让配置生效。如果没有域名,server_name可以留空或直接写IP,不影响访问。
6.2 静态站点与反向代理的快速示例
把网页文件放进/var/www/myblog后,访问公网IP就能看到页面。如果你想做反向代理,比如把本机8080端口跑的Java服务通过80端口对外提供,只需要在server块里加一句proxy_pass:
server { listen 80; server_name api.myblog.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; } }修改后执行nginx -t && systemctl reload nginx,就能用80端口访问8080的服务了。这里有一个很常见的细节问题:如果后端服务需要真实客户端IP,Nginx转发时默认不会带上,必须像上面这样用proxy_set_header把X-Real-IP和X-Forwarded-For传过去,否则后端拿到的都是代理服务器IP。
Nginx的负载均衡也是类似思路,通过upstream定义一组后端服务器,请求自动分发到不同节点。这里先不展开,等你有真实业务需求再研究也不迟。
6.3 日志就是最好的排错助手
只要遇到问题,不要瞎猜。先看错误日志。Nginx默认错误日志在/var/log/nginx/error.log,访问日志在/var/log/nginx/access.log。你可以执行tail -f /var/log/nginx/error.log实时观察,然后刷新一次页面,立刻就能看到新的报错信息。
我就遇到过403,查了半天,后来发现是网页目录权限不对,Nginx工作进程没有读取权限。调整之后,用chmod -R o+r /var/www/myblog解决。日志能让你少走很多弯路,遇到任何访问异常,第一个动作永远是看日志。
7. 常见问题与排查技巧实录
7.1 连接阶段的问题排查
Xshell连接是第一个会遇到问题的环节,下面这张表是我实践中最常遇到的几种情况,做成速查表方便你对照排查。
| 问题 | 可能原因 | 快速处理 |
|---|---|---|
| Xshell连接超时 | IP填错、安全组未放行22、服务器关机 | 检查公网IP、控制台安全组、实例状态 |
| 连接被拒绝 | 端口不对、SSH服务未启动 | 执行systemctl status sshd或systemctl status ssh |
| 密码正确却提示认证失败 | Ubuntu默认禁止root密码登录,或重置密码后未重启 | 使用初始用户登录,或在控制台重置密码后重启 |
| 主机密钥警告 | 系统重装或密钥变更 | 在Xshell中移除旧主机密钥后重新连接 |
连接阶段的核心思路是:先确认网络通不通,再确认端口通不通,最后确认认证信息对不对,层层缩小范围,通常几分钟就能定位。
7.2 安装阶段的问题排查
安装Nginx的时候,最容易卡在软件源和依赖上。同样整理成速查表:
| 问题 | 可能原因 | 快速处理 |
|---|---|---|
| No package nginx available | 源里没有Nginx | 启用EPEL,或者先执行apt update |
| configure报缺库 | 编译依赖没装全 | 看报错提示,安装对应的devel包 |
| nginx命令找不到 | 包没装成功或PATH问题 | 重新安装,或使用/usr/local/nginx/sbin/nginx |
| 80端口被占用 | 已有Apache等其他程序占用 | 用ss -lntp查占用进程,停用或改端口 |
遇到安装问题别急着换方法,先确认你用的是哪个发行版、哪个包管理器,再对照表格里的方向去查,基本都能解决。
7.3 访问阶段的问题排查
服务启动成功后,浏览器无法访问是另一个高频问题。速查表如下:
| 问题 | 可能原因 | 快速处理 |
|---|---|---|
| 浏览器打不开IP | 安全组、系统防火墙未放行80 | 检查两层防火墙规则 |
| 403 Forbidden | 网站目录无权限,或index文件不存在 | 检查目录权限和index.html |
| 404 Not Found | 站点配置root路径不对 | 核对location和root |
| 500 Internal Server Error | 配置语法错误或代理目标不可达 | 看error.log,执行nginx -t |
访问阶段有一个原则:先本地后公网。本地curl验证服务是否正常,再看公网访问是否被拦截,这样不会把问题复杂化。
8. 再给新手的几条避坑心得
8.1 先小后大,养成自测习惯
很多人习惯一次性把服务装好,然后直接访问公网IP,一旦失败就无从下手。我的习惯是:先本地curl通,再测本机IP;本机IP通了,再看公网访问。一步一步递进,能快速定位故障层。另外,每次改动Nginx配置,务必先执行nginx -t,检查通过再reload。别嫌多此一举,这个习惯能让你避免很多线上事故。
8.2 命令太多记不住,建议做一个笔记模板
当你开始接触Linux,命令量会快速增加。我建议建一个笔记,按“连接、软件安装、服务管理、日志排查、配置示例”这几个分类来记录。今天这篇文章里的命令,已经足够你完成一次从零到一的部署了。遇到新问题,就在笔记里持续补充。我越来越觉得,所谓经验丰富,无非是踩过的坑记得比别人详细而已。
8.3 安全底线不能忘
服务器上线后,尽量别直接用root密码远程登录,尤其是密码比较弱的情况。更稳妥的做法是创建普通用户,配置SSH密钥登录,关闭密码登录,并定期用包管理器更新系统补丁。个人项目如果只是测试阶段,不改问题不大;但只要服务对公网开放,建议把SSH端口、防火墙规则、访问日志都过一遍。
这次从HoRain云服务器到Xshell连接,再到Nginx安装和访问,整个过程其实不算复杂,关键是把每一步想明白。我个人最大的体会是,云服务器、SSH客户端、Nginx这三样东西组合在一起,是如今做个人网站、小应用最常见的起跑线。你在实际操作中如果遇到文章里没写到的情况,别急着怀疑自己,按“连接、服务、防火墙”三步走一遍,大多数问题都能定位出来。希望这份记录能帮你省下几个小时的折腾时间。