这篇文章教你在 Linux 服务器上最常用的一套操作:怎么连上去、怎么传文件、怎么把应用跑成常驻服务、怎么用 Nginx 把服务暴露到公网。全是实际踩过的坑和正确做法。
SSH = 加密远程登录协议。从本地终端连到服务器:
ssh 用户名@服务器IP # 例子: ssh root@203.0.113.7
如果用密钥文件(阿里云/腾讯云常见,见教程 4):
ssh -i ~/my-server-key.pem user@服务器IP
chmod 600 ~/my-server-key.pem常用的省事做法:配置 SSH 别名,编辑 ~/.ssh/config:
Host my-server
HostName 203.0.113.7
User user
IdentityFile ~/my-server-key.pem
之后直接 ssh my-server 就能连上。
本地生成一对密钥,公钥放到服务器,之后登录就不用输密码:
ssh-keygen -t ed25519 # 一路回车 ssh-copy-id 用户名@服务器IP # 把公钥推上去
推送过一次后,以后 ssh 直接免密登录。
SCP 基于 SSH,传文件最常用:
# 本地 → 服务器 scp -i ~/my-server-key.pem ./app.py user@服务器IP:/home/user/app.py # 服务器 → 本地 scp -i ~/my-server-key.pem user@服务器IP:/home/user/app.py . # 传整个目录(-r) scp -r -i ~/my-server-key.pem ./myapp user@服务器IP:/home/user/
cat 本地文件 | ssh my-server 'cat > /home/user/目标文件'写完一个 Flask 应用,python app.py 一关终端就没了。要让它常驻 + 开机自启,用 systemd。
① 写服务单元文件 myapp.service:
[Unit] Description=我的应用 After=network.target [Service] User=admin WorkingDirectory=/home/user/myapp ExecStart=/usr/bin/python3 /home/user/myapp/app.py Restart=always [Install] WantedBy=multi-user.target
② 安装并启动:
sudo cp myapp.service /etc/systemd/system/ sudo systemctl daemon-reload sudo systemctl enable --now myapp # 启动 + 开机自启 sudo systemctl is-active myapp # 看是否在跑
which python3 确认实际解释器。journalctl -u myapp -n 20 看真实报错。常用命令速查:
| 命令 | 作用 |
|---|---|
| systemctl status myapp | 看状态+最近日志 |
| systemctl restart myapp | 重启 |
| systemctl stop myapp | 停止 |
| systemctl disable myapp | 取消开机自启 |
| journalctl -u myapp -f | 实时跟日志 |
应用跑在服务器本机端口(如 5000),外人访问不到。Nginx 把域名/路径转发到这个端口。
① 加一个 location 块(编辑站点配置 /etc/nginx/sites-enabled/你的站点):
server {
listen 443 ssl;
server_name 你的域名.com;
location /myapp/ {
proxy_pass http://127.0.0.1:5000/;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_read_timeout 300s; # 长任务要加大,否则 nginx 先掐断
}
}
② 测试配置并重载(改配置前先备份):
sudo cp 站点配置 站点配置.bak-$(date +%Y%m%d) sudo nginx -t # 语法检查,必须看到 ok / successful sudo systemctl reload nginx
cp 备份 站点配置 恢复,再 nginx -t 确认回干净状态。③ 验证:公网 curl 域名 + 路径,应返回 200。同时确认别的站点不受影响(多站共存时挨个 curl 一遍)。
服务出问题,第一件事看日志:
journalctl -u myapp -n 50 # 最近 50 行 journalctl -u myapp -f # 实时跟 sudo tail -f /var/log/nginx/error.log
排查顺序(经验):先看应用自己有没有起(is-active + journalctl),再看端口有没有监听(ss -tlnp | grep 端口),再看 nginx 语法(nginx -t),最后才看公网。
curl 127.0.0.1:端口 确认应用自己通不通,再查 nginx。服务器裸奔在公网上,扫描机器人 24 小时都在试你。至少做到:
PasswordAuthentication noPermitRootLogin no,用普通用户 + sudochmod 600sudo apt update && sudo apt upgrade,装 unattended-upgrades 自动打安全补丁