Linux服务器运维入门

🏷️ L2 📊 intermediate ⏱️ 50分钟 🏷️ Linux,服务器运维,SSH,命令,服务管理

好的,各位工程师同学,大家好。我是你们的IT导师。今天我们进入一个非常重要的进阶主题——Linux服务器运维入门

很多同学已经会安装Linux,能敲一些基础的lscd命令了。但真正的运维工作,远不止于此。如何管理用户权限,防止权限漏洞?如何让一个服务开机自启,崩溃后自动恢复?如何从成百上千行的日志里,精准定位故障?如何安全地管理远程服务器?这些才是从“会用”到“会管”的关键跨越。

这节进阶课,我们就来攻克这些核心难点。请准备好你们的终端,我们开始。

---

一、概述

1. 应用场景与重要性

想象一下,你负责的公司核心业务系统(比如电商网站、数据库、API网关)都运行在一台或多台Linux服务器上。你的工作不是重启电脑,而是确保这些系统:

这就是Linux服务器运维的核心价值。掌握它,你将从一个“开发者”或“入门用户”,蜕变为能独当一面的“系统守护者”。

2. 适合人群与前置知识

---

二、核心知识

1. 核心技术原理

Linux运维的核心,是理解并管理三个抽象概念:进程、文件、用户

2. 关键概念与术语

| 术语 | 通俗解释 | 示例 | | :--- | :--- | :--- | | UID/GID | 用户ID / 组ID。系统内部用数字标识用户,而不是名字。 | root用户的UID是0。 | | rwx | 读(4)、写(2)、执行(1)。文件权限的三组:属主、属组、其他用户。 | chmod 755 file 意味着属主可读写执行(7),组和其他用户可读执行(5)。 | | Systemd | 现代Linux系统的“一号进程”,负责初始化系统和服务管理。取代了老的SysV init。 | systemctl start nginx | | Unit | Systemd管理的“单位”,可以是服务(.service)、挂载点(.mount)、套接字(.socket)等。 | nginx.service 就是一个Unit。 | | Journald | Systemd自带的日志收集守护进程,将日志集中管理,结构化存储。 | journalctl -u nginx.service | | SSH Key | 一种非对称加密的认证方式,比密码登录更安全。公钥放服务器,私钥自己保管。 | ssh-keygen 生成密钥对。 | | SELinux/AppArmor | 强制访问控制系统(MAC)。即使root用户,也要受它的规则限制。新手可以暂时关闭,但生产环境建议开启。 | getenforce 查看SELinux状态。 |

3. 核心知识点与示例

知识点一:用户权限管理的精髓——`chmod`与`chown`

原理:文件权限由三组rwx决定,通过数字(如755)或符号(u+x)修改。chown改变文件拥有者。

示例:部署一个Web应用,代码放在/var/www/myapp


# 1. 创建部署用户(假设叫 deploy)
sudo useradd -m -s /bin/bash deploy

# 2. 将应用目录的所有者改为deploy sudo chown -R deploy:deploy /var/www/myapp

# 3. 设置目录权限:属主(deploy)可读写执行(7),组和其他人只能读和执行(5) # 这样deploy可以修改文件,而nginx(通常以www-data用户运行)只能读取和执行。 sudo chmod -R 755 /var/www/myapp

# 4. 但对于一些需要写入的目录(如缓存、上传),权限要更宽松 sudo chmod -R 775 /var/www/myapp/storage # 或者将nginx用户加入deploy组,然后设置目录的组权限为7 sudo usermod -a -G deploy www-data


知识点二:服务管理——`systemctl`的常用套路

原理systemctl命令是Systemd的客户端,通过它来管理Unit。核心状态有:active (running), enabled(开机自启), failed

示例:管理Nginx服务。


# 1. 启动服务
sudo systemctl start nginx

# 2. 停止服务 sudo systemctl stop nginx

# 3. 重启服务(先停止再启动) sudo systemctl restart nginx

# 4. 重新加载配置(不中断服务,优雅更新) sudo systemctl reload nginx

# 5. 查看服务状态(最常用!) sudo systemctl status nginx # 输出会显示:是否运行,PID,最近日志等。

# 6. 设置开机自启 sudo systemctl enable nginx

# 7. 取消开机自启 sudo systemctl disable nginx

# 8. 检查服务是否设置为开机自启 sudo systemctl is-enabled nginx


知识点三:日志查看的艺术——`tail`, `grep`, `journalctl`

原理:日志是系统运行的历史记录。tail看文件尾部(最新日志),grep过滤关键信息,journalctl查询Systemd的集中日志。

示例:排查Nginx访问失败的案例。


# 1. 实时查看Nginx错误日志(最新10行,并持续追踪)
sudo tail -f /var/log/nginx/error.log

# 2. 假设看到很多 502 Bad Gateway,怀疑是PHP-FPM挂了 # 过滤PHP-FPM日志中的错误信息 sudo grep -i "error\|failed\|timeout" /var/log/php-fpm/www-error.log

# 3. 使用journalctl查看今天凌晨2点到3点之间,关于nginx的服务日志 sudo journalctl -u nginx.service --since "2023-10-27 02:00:00" --until "2023-10-27 03:00:00"

# 4. 查看内核日志(硬件、驱动问题) sudo dmesg | tail -20


知识点四:SSH远程管理——从密码到密钥的进化

原理:SSH连接过程首先验证身份(密码或密钥),然后建立加密通道。密钥登录是更安全、更自动化的方式。

示例:配置免密码密钥登录。


# 1. 在本地客户端电脑上生成密钥对(一路回车即可)
ssh-keygen -t rsa -b 4096
# 默认会在 ~/.ssh/ 下生成 id_rsa(私钥)和 id_rsa.pub(公钥)

# 2. 将公钥上传到服务器 ssh-copy-id -i ~/.ssh/id_rsa.pub user@your_server_ip # 输入一次密码后,公钥会被追加到服务器的 ~/.ssh/authorized_keys 文件中

# 3. 测试登录(此时应该不再需要密码) ssh user@your_server_ip

# 4. 安全加固:禁用密码登录 sudo vim /etc/ssh/sshd_config # 找到并修改以下两行: # PasswordAuthentication no # PubkeyAuthentication yes # PermitRootLogin prohibit-password # 禁止root用密码登录,但允许密钥

# 5. 重启SSH服务 sudo systemctl restart sshd


---

三、实操步骤

场景:部署一个简单的Python Flask Web应用,并使用Nginx作为反向代理。

步骤1:安装必要软件


# 更新包管理器
sudo apt update
# 安装Nginx, Python3, pip, virtualenv
sudo apt install -y nginx python3 python3-pip python3-venv

步骤2:创建部署用户和项目目录


# 创建专用用户
sudo useradd -m -s /bin/bash flaskapp
# 创建项目目录
sudo mkdir -p /var/www/flaskapp
# 更改所有者
sudo chown -R flaskapp:flaskapp /var/www/flaskapp

步骤3:部署Flask应用(以flaskapp用户执行)


# 切换到flaskapp用户
sudo su - flaskapp

# 进入项目目录 cd /var/www/flaskapp

# 创建Python虚拟环境 python3 -m venv venv

# 激活虚拟环境 source venv/bin/activate

# 安装Flask和Gunicorn(生产级WSGI服务器) pip install flask gunicorn

# 创建一个简单的应用文件 app.py cat > app.py <<EOF from flask import Flask app = Flask(__name__)

@app.route('/') def hello(): return "Hello, Linux Server!"

if __name__ == '__main__': app.run() EOF

# 测试运行(先手动测试) gunicorn --workers 3 --bind 0.0.0.0:8000 app:app # 在浏览器访问 http://你的服务器IP:8000 应该能看到 "Hello, Linux Server!" # 按 Ctrl+C 停止

# 退出flaskapp用户 exit


步骤4:配置Systemd服务,让Flask应用开机自启


# 创建服务文件
sudo vim /etc/systemd/system/flaskapp.service

在文件中写入:


[Unit]
Description=Gunicorn instance to serve FlaskApp
After=network.target

[Service] User=flaskapp Group=flaskapp WorkingDirectory=/var/www/flaskapp Environment="PATH=/var/www/flaskapp/venv/bin" ExecStart=/var/www/flaskapp/venv/bin/gunicorn --workers 3 --bind unix:flaskapp.sock -m 007 app:app

[Install] WantedBy=multi-user.target


配置参数说明

  • `After=network.target`:在网络服务之后启动。
  • `User/Group`:指定运行该服务的用户,**绝不使用root**。
  • `WorkingDirectory`:工作目录。
  • `Environment`:设置环境变量,这里指定了PATH,让系统能找到Gunicorn。
  • `ExecStart`:启动命令。`--bind unix:flaskapp.sock` 表示监听一个Unix Socket文件,而不是端口,这样性能更好,也更安全(只允许本地Nginx访问)。
  • `-m 007`:设置Socket文件的umask,确保Nginx能读写。
  • `WantedBy=multi-user.target`:表示在系统进入多用户模式(正常启动)时启动此服务。


# 重新加载Systemd配置
sudo systemctl daemon-reload

# 启动服务 sudo systemctl start flaskapp

# 设置开机自启 sudo systemctl enable flaskapp

# 检查状态 sudo systemctl status flaskapp


步骤5:配置Nginx反向代理


# 创建Nginx配置文件
sudo vim /etc/nginx/sites-available/flaskapp

写入配置:


server {
listen 80;
server_name your_domain_or_ip;  # 换成你的域名或IP

location / { include proxy_params; proxy_pass http://unix:/var/www/flaskapp/flaskapp.sock; } }


配置参数说明

  • `listen 80`:监听80端口(HTTP)。
  • `server_name`:指定域名,如果只有IP可以写`_`。
  • `location /`:匹配所有请求。
  • `include proxy_params`:包含Nginx的代理参数文件(通常在`/etc/nginx/proxy_params`),它会传递客户端IP、Host等信息。
  • `proxy_pass`:将请求转发到我们之前配置的Unix Socket。


# 启用站点(创建软链接)
sudo ln -s /etc/nginx/sites-available/flaskapp /etc/nginx/sites-enabled/

# 检查Nginx配置语法 sudo nginx -t

# 重启Nginx sudo systemctl restart nginx


步骤6:验证

打开浏览器,访问 http://你的服务器IP。你应该看到 Hello, Linux Server!。成功了!

---

四、故障排查

问题1:服务启动失败(`systemctl status`显示`failed`)

  • **判断思路**:
1. 查看详细错误sudo journalctl -u flaskapp.service -n 50 --no-pager 2. 检查配置文件语法:如果是Nginx,用nginx -t;如果是Systemd服务文件,检查ExecStart路径是否正确。 3. 检查权限:服务文件中的User是否有权限访问工作目录、执行程序、写入Socket文件?用ls -l检查。 4. 检查端口冲突sudo netstat -tulpn | grep :8000 看端口是否被占用。
  • **解决**:根据`journalctl`输出的具体错误信息修正。例如,`Permission denied` -> 修改目录权限;`Address already in use` -> 杀掉占用进程或改端口。

问题2:Nginx返回502 Bad Gateway

  • **判断思路**:502表示Nginx作为代理,无法从上游服务器(我们的Flask应用)获得有效响应。
1. 检查Flask应用是否运行sudo systemctl status flaskapp 2. 检查Socket文件是否存在ls -la /var/www/flaskapp/flaskapp.sock 3. 检查Socket文件权限:Nginx运行用户(通常是www-data)是否有权限读取该文件?sudo -u www-data cat /var/www/flaskapp/flaskapp.sock 会报错,但可以ls -l看权限,确保组或其他用户有r权限。 4. 检查Nginx错误日志sudo tail -f /var/log/nginx/error.log 会给出具体原因,如“connect() to unix:... failed (13: Permission denied)”。
  • **解决**:
  • 如果是权限问题:`sudo chmod 755 /var/www/flaskapp/` 并确保Socket文件权限正确(我们的`-m 007`已处理)。
  • 如果是Flask应用挂了:重启它 `sudo systemctl restart flaskapp`,并检查其日志。

问题3:SSH连接被拒绝(`Connection refused`)

  • **判断思路**:
1. 检查SSH服务是否运行:在服务器本地(或通过远程控制台)执行 sudo systemctl status sshd。 2. 检查防火墙sudo iptables -L -nsudo ufw status,看22端口是否被放行。 3. 检查SSH配置sudo cat /etc/ssh/sshd_config,看Port是否被修改,ListenAddress是否限制。
  • **解决**:
  • 如果服务没启动:`sudo systemctl start sshd`。
  • 如果防火墙阻止:`sudo ufw allow 22/tcp` 或 `sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT`。
  • 如果配置错误:修正后 `sudo systemctl restart sshd`。

问题4:磁盘空间满了(`No space left on device`)

  • **判断思路**:
1. 检查磁盘使用率df -h 2. 查找大文件sudo du -sh /* | sort -rh | head -10 从根目录开始找大目录。 3. 查找已删除但仍被进程占用的文件sudo lsof | grep deleted。这些文件虽然被rm了,但因为有进程在读写,空间并未释放。
  • **解决**:
  • 清理日志:`sudo journalctl --vacuum-size=500M`(保留500M日志),或手动清理`/var/log`下的旧日志。
  • 清理包缓存:`sudo apt autoremove && sudo apt autoclean`。
  • 对于被占用文件:重启占用该文件的进程(如 `sudo systemctl restart rsyslog`)。

问题5:用户权限不足(`Permission denied`)

  • **判断思路**:使用`ls -l`查看文件/目录的**属主、属组、权限**。使用`id`命令查看当前用户的UID、GID和所属组。
  • **解决**:
  • **修改属主**:`sudo chown user:group file`
  • **修改权限**:`sudo chmod 755 file`
  • **将用户加入组**:`sudo usermod -a -G groupname username`(注意:加入组后,用户需要重新登录才能生效)。

---

五、最佳实践与总结

1. 行业最佳实践建议

  • **最小权限原则**:永远不要用`root`执行日常操作。为每个应用创建专用系统用户(如`nginx`, `mysql`, `flaskapp`)。给文件目录刚刚好的权限。
  • **配置即代码**:将系统配置、服务配置文件(如Nginx、Systemd服务文件)纳入版本控制(如Git)。这样便于回溯、审计和自动化部署。
  • **监控与告警**:不要等人报故障。部署监控工具(如Prometheus + Grafana, Zabbix, Nagios)监控CPU、内存、磁盘、网络、关键服务状态。配置告警,在问题发生前或发生时立刻通知你。
  • **日志集中管理**:当服务器数量超过3台,就不要每台登录看日志了。使用ELK(Elasticsearch, Logstash, Kibana)或Loki等工具将日志集中收集、索引、可视化。
  • **定期备份**:脚本化备份关键数据和配置文件,并定期测试恢复流程。备份是运维最后的救命稻草。
  • **自动化一切**:学习Ansible、SaltStack或Puppet等配置管理工具,实现批量服务器的自动化部署、配置和更新。

2. 安全注意事项

  • **SSH密钥优先**:禁用密码登录,仅使用密钥认证。
  • **修改默认端口**:将SSH端口从22改为一个高位端口(如2222),能有效减少被扫描攻击的概率。
  • **防火墙**:开启防火墙(`ufw`或`firewalld`),仅开放必要的端口(如80, 443, SSH端口)。
  • **及时更新**:定期执行`sudo apt update && sudo apt upgrade`,安装安全补丁。
  • **SELinux/AppArmor**:在生产环境中,花时间学习并开启SELinux或AppArmor,它们能提供最后一道防线,即使应用被攻破,也能限制其破坏范围。

3. 扩展学习方向

  • **Shell脚本编程**:将重复性工作(如日志清理、备份、健康检查)写成脚本,实现自动化。
  • **容器化技术**:学习Docker和Kubernetes。它们改变了应用交付和运维的方式,是现代运维的必备技能。
  • **云计算平台**:熟悉至少一个主流云平台(AWS, Azure, GCP, 阿里云),学习其提供的虚拟主机、负载均衡、数据库等托管服务。
  • **监控与告警系统**:深入掌握Prometheus + Grafana,这是目前最流行的开源监控组合。
  • **CI/CD**:学习Jenkins, GitLab CI, GitHub Actions等,构建自动化构建、测试、部署流水线。

总结

同学们,今天我们从一个简单的Flask应用部署案例出发,贯穿了用户权限、服务管理、日志查看和SSH远程管理这四个核心模块。请记住,运维不是死记硬背命令,而是理解其背后的原理设计思想

  • **权限**是安全的基础。
  • **服务**是系统的骨架。
  • **日志**是问题的侦探。
  • **SSH**是管理的通道。

当你遇到问题时,不要慌张,按照我们故障排查的思路:先看状态,再看日志,最后检查配置和权限。多动手,多犯错,多总结,你一定能成为一名优秀的系统守护者。

今天的课就到这里,下课!有什么问题随时在群里交流。

在博海学习网开始学习 →