为什么 PC 不适合作为服务器?
- 外界无法通过 IP 地址访问到你的 PC
- 因为多个家用设备共享路由器对外统一使用的 IP 地址,除非使用内网穿透
- 家用网络的 IP 地址往往是动态的
- 性能要求会减短 PC 使用寿命
可以在 Racknerd、BWH、Lisa、腾讯云 等服务商上选购 VPS / 云服务器,之后可以在 Namesilo 上购买域名,并将域名托管到 Cloudfare。
我参考了 这篇博客,VPS 推荐,1C/1G/20G(21.99$/yr)。如果使用国内服务器,域名必须备案,否则有可能会被封禁。
启动
使用硬盘启动时
- UEFI 固件会在硬盘的 ESP 分区里寻找 EFI 启动文件 (如
grubx64.efi) 并启动 - 引导程序
grub把内核映像vmlinuz和临时根文件系统映像initramfs加载进内存 vmlinuz自解压成内核vmlinux到指定地址- 内核在内存中建立
ramfs/tmpfs文件系统,然后将initramfs解压并挂载该文件系统至临时根目录/ - 执行
/init脚本,启动udevd扫描 PCI/USB 等总线,发现硬件设备 (如 NVMe 控制器) 后将initramfs里相应的驱动模块 (如nvme.ko,ext4.ko) 加载进内核 - 内核根据启动参数 (
root=UUID...) 找到系统真正所在分区 (如/dev/nvme0n1p2) 并挂载在/sysroot - 执行
switch_root将当前挂载点切换至/sysroot,释放initramfs占用的内存,执行/sbin/init(即systemd)
SSH
检查本地是否已安装 SSH
ssh -V使用 SSH 远程登录服务器
ssh ubuntu@xxx.xx.xx.xx以往 Telnet 或 FTP 使用明文传输。SSH (Secure SHell,安全外壳协议) 是互联网上最主流、最安全的远程登录和数据传输加密协议。
- 服务器开机后,
systemd直系子进程sshd调用socket()和accept()时刻监听 22 号端口 (处于阻塞状态)。 - 客户
A在终端输入ssh user@IP [-p Port],尝试让客户端ssh与服务器的sshd建立 TCP 连接。 sshd被内核唤醒,执行fork()后立刻回到accept()阻塞状态,等待下一位客户。fork()出来的子进程 (记为B) 接管socket,通过 TCP (明文信道) 与客户端交换 SSH 版本信息、支持的加密算法 (KEX),生成本次会话 ID 和对称加密密钥 (Diffie-Hellman),接下来的通信将被加密。- 由于 TCP 只负责在网络层上的连接,进程
B仍需判断机器背后的用户A是否有权访问服务器,便fork()出子进程C以认证- 进程
C向用户A发出认证请求,该请求包含了由所有有权用户的公钥组成的列表 (「名单上有你吗?」) - 用户
A查看自己的钥匙扣~/.ssh是否存在相应私钥 (事前可使用ssh-keygen生成公私钥),有则把自己的算法类型和公钥打包成二进制块并发送,无则直接发送密码包(「有!是公钥 xxx」「没有!密码是 xxx」) - 进程
C收到数据包,- 对于公钥认证请求,在
user留下的通讯录/home/user/.ssh/authorized_keys(权限必须是600,即仅user可读写,防止被恶意添加公钥) 里逐一比对公钥。若匹配成功,使用该公钥加密一串随机数,发回给客户端,对A发起挑战 (「如果真是你,应该能回答我出的题」)。A收到挑战,用相应私钥解密,将随机数答案和当前会话 ID 打包成数字签名(私钥也被用于签名),发回给C(「交卷签字」)。C收到答案,验签得知的确是A的解答。若回答正确,则通知A认证成功。 - 对于密码认证请求,若密码正确,则通知
A认证成功。
- 对于公钥认证请求,在
- 进程
- 认证完毕后,
B第二次fork()出子进程D以交接。此时D负责用户交互,B作为监控进程负责网络 I/O。D调用setsid()创建新会话D调用openpty()申请伪终端,得到文件描述符master_fd(ptm) 和slave_fd(pts)。D自己持有 master 端,把 slave 端 (/dev/pts/N) 交给fork()出的子进程E。子进程E继承了父进程D的会话,但当前会话尚未关联控制终端- 子进程
E调用ioctl(slave_id, TIOCSCTTY, 0)绑定 slave 端为控制终端,并通过dup2()将当前进程的stdin/stdout/stderr对准控制终端 - 子进程
E查看在/etc/passwd里A配置的 shellA:x:1000:1000::/home/A:/bin/bash,然后execve("/bin/bash"),shell 此时的控制终端就是/dev/pts/N
- 循环:
- 负责用户 I/O 的父进程
B收到来自 socket 的经过加密的用户A的键盘事件,解密后交给子进程D - 子进程
D将键盘事件write(master_fd)直接写入master端,之后 TTY 子系统产生的回显写回 master 端,交由B通过网络传回客户端,A的终端显示与/dev/pts/N一致 - 在此期间,子进程
D还会监听窗口大小变化 (SSH 协议允许客户端发送窗口改变请求),调用ioctl(master_fd, TIOCSWINSZ, &winsize)更新 slave 端尺寸,内核自动向对应会话的前台进程组发送SIGWINCH
- 负责用户 I/O 的父进程
- 客户端网络断开时,
D关闭master_fd,内核 PTY 层产生 hangup,slave 端会话首进程 (shell) 收到SIGHUP,进而清理整个会话,所有远程作业被终止
输入密码后,完成登录
The authenticity of host 'xxx.xx.xx.xx (xxx.xx.xx.xx)' can't be established.ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.This key is not known by any other names.Are you sure you want to continue connecting (yes/no/[fingerprint])? yesWarning: Permanently added 'xxx.xx.xx.xx' (ED25519) to the list of known hosts.ubuntu@xxx.xx.xx.xx's password:Welcome to Ubuntu 24.04.4 LTS (GNU/Linux 6.8.0-124-generic x86_64)
* Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/pro
System information as of Tue Jul 21 09:41:31 PM CST 2026
System load: 0.01 Processes: 136 Usage of /: 13.7% of 39.26GB Users logged in: 1 Memory usage: 9% IPv4 address for eth0: 10.1.0.11 Swap usage: 0%
* Strictly confined Kubernetes makes edge and IoT secure. Learn how MicroK8s just raised the bar for easy, resilient and secure K8s cluster deployment.
https://ubuntu.com/engage/secure-kubernetes-at-the-edge
Expanded Security Maintenance for Applications is not enabled.
144 updates can be applied immediately.103 of these updates are standard security updates.To see these additional updates run: apt list --upgradable
7 additional security updates can be applied with ESM Apps.Learn more about enabling ESM Apps service at https://ubuntu.com/esm
Last login: Tue Jul 21 21:23:16 2026 from xxx.xxx.xxx.xxx$ pwd/home/ubuntu$ iduid=1000(ubuntu) gid=1001(ubuntu) groups=1001(ubuntu),4(adm),20(dialout),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),101(lxd),1000(netdev)若要延长 SSH 连接时间,修改 /etc/ssh/sshd_config:
# 取消注释,保持 TCP 连接活跃,每 10 秒发出信号,5 次没响应就断开连接TCPKeepAlive yesClientAliveInterval 10ClientAliveCountMax 5让 ubuntu 能通过 SSH 连接上 Github 仓库
$ ssh-keygen -t ed25519 -C "user@email.com"Generating public/private ed25519 key pair.Enter file in which to save the key (/home/nisemono/.ssh/id_ed25519):Enter passphrase (empty for no passphrase):Enter same passphrase again:Your identification has been saved in /home/nisemono/.ssh/id_ed25519Your public key has been saved in /home/nisemono/.ssh/id_ed25519.pubThe key fingerprint is:SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx user@email.comThe key's randomart image is:+--[ED25519 256]--+| xxxxxxx || xxxxxxxxxxx || xxxxxxxxxxx ||xxxxxxxxxxxxx ||xxxxxxxxxxxx ||xx xxx xx ||xxx || x || |+----[SHA256]-----+$ cat ~/.ssh/id_ed25519.pubssh-ed25519 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX user@email.com$ ssh -T git@github.comThe authenticity of host 'github.com (20.205.243.166)' can't be established.ED25519 key fingerprint is SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.This key is not known by any other names.Are you sure you want to continue connecting (yes/no/[fingerprint])? yesWarning: Permanently added 'github.com' (ED25519) to the list of known hosts.Hi user! You've successfully authenticated, but GitHub does not provide shell access.
-T意思是不需要交互式命令行界面,即不申请 PTY。用户只想传输数据或执行一条命令,然后立刻结束连接。git@github.com的github.com是 Github 主机的域名,git是该主机的用户。
事先说明:远程仓库已经放好了网页文件
git initgit add .git statusgit commit -m "feat: add tiny web"git remote add origin git@github.com:user/tiny-web.gitgit branch # 查看当前分支名,注意 master/maingit push origin master:master # 本地分支:远程分支目录
系统级别的目录
| 目录 | 说明 |
|---|---|
/ | 根目录 |
/boot/ | 启动目录 (EFI 分区),内含 vmlinuz,initramfs,grub 等 |
/bin/ | 普通工具,一般软链至 /usr/bin/ |
/sbin/ | 系统工具,一般软链至 /usr/bin/ |
/lib/ | 内核模块,基础 C 动态链接库 (如 libc.so),软链至 /usr/lib |
/etc/ | 系统全局配置,与用户个人配置 ~/.config/ 相对 |
/usr/ | 系统资源,如命令、库、软件 |
/var/ | 持久化可变数据,如系统日志 /var/log/,网页 /var/www/ |
/tmp/ | 临时文件,系统重启自动清空 |
内核接口以目录形式呈现
| 接口 | 说明 |
|---|---|
/proc/ | 进程信息和内核参数 (如 cpuinfo,meminfo) |
/sys/ | 硬件设备信息 (如总线、驱动、电源管理) |
/dev/ | 设备文件 (如硬盘 sda、终端 tty、黑洞 null、随机数 random) |
用户级别的目录
| 目录 | 说明 |
|---|---|
/home/<user>/ | 用户 user 的家目录 ~ |
/root/ | 管理员 root 的家目录 |
/media/ | 外设自动挂载点 (U 盘、现代桌面环境) |
/mnt/ | 手动挂载点 |
外部目录
| 目录 | 说明 |
|---|---|
/opt/ | 第三方闭源软件 (如 Google Chrome,Oracle JDK,WeChat) |
/srv/ | 本机服务提供的数据 (如 Web 网页根目录、FTP 文件仓库) |
在 /etc/ 里常见
| 文件或目录 | 说明 |
|---|---|
/etc/fstab | 文件系统挂载表,定义开机时自动挂载哪些分区 (如硬盘,U 盘) |
/etc/systemd | systemd 配置,含默认启动级别、用户限额、计时器配置 |
/etc/passwd | 用户数据表,含用户名,uid,gid,家目录,默认 shell |
/etc/group | 用户组数据表,含组名,gid,组内用户 |
/etc/shadow | 用户加密密码,有效期 |
/etc/sudoers | sudo 权限表 |
/etc/hostname | 主机名 |
/etc/hosts | 本地静态 DNS 解析表,优先级高于公网 DNS |
/etc/resolv.conf | 指定首选 DNS 服务器 |
/etc/network/ | 网卡配置,含 IP,子网掩码,网关 |
/etc/ssh/ | SSH 配置,客户端/服务端配置 ssh_config/sshd_config |
/etc/apt/ | 软件源仓库地址,定义 apt 从哪里下载软件包 |
/etc/<app> | 软件配置,与软件名同名,如 nginx,docker,mysql |
在 /usr/ 里常见
| 目录 | 说明 |
|---|---|
/usr/bin/ | 普通工具,如 ls,cat,git |
/usr/sbin/ | 系统工具,如分区工具 fdisk/gdisk,服务任务管理 systemstl |
/usr/lib/ | 库文件,为 bin 和 sbin 的程序提供运行支持 |
/usr/share/ | 只读共享数据,如字体、主题素材、文档、区域、i18n |
/usr/local/ | 不使用包管理手动编译安装路径,含子结构 ./bin/,./lib/ |
/usr/include/ | C/C++ 标准头文件默认目录 |
在 /var/ 里常见
| 目录 | 说明 |
|---|---|
/var/log/ | 系统所有服务的日志文件,如 syslog,nginx/,mysql/ |
/var/lib/ | 应用的持久化数据,如 dpkg/,docker/ |
/var/cache/ | 应用缓存,如 .deb 软件包,字体缓存 |
/var/www/ | 网页文件 |
apt
安装常见应用
sudo apt updatesudo apt install fish neofetch btop fzf treesudo apt update # 刷新软件仓库源列表sudo apt upgrade # 升级所有已安装软件apt list --installed # 查看已安装软件apt search <关键词> # 在软件仓库中搜索apt show <软件名> # 展示软件描述、版本、依赖关系、大小sudo apt install <软件名> # 安装软件sudo apt remove <软件名> # 卸载软件 (保留配置文件)sudo apt purge <软件名> # 卸载软件 (不保留配置文件)sudo apt autoremove # 卸载无用软件sudo apt install --reinstall <软件名> # 重装软件用户
sudo useradd -m -s /usr/bin/fish nisemonosudo passwd nisemonosudo usermod -aG sudo nisemonosu -l nisemono$ iduid=1002(nisemono) gid=1003(nisemono) groups=1003(nisemono),27(sudo)useradd:-m/-M创建/不创建家目录,-sshell,-g主组 (默认同名),-G附加组 (默认只有主组)usermod:修改用户属性,参数与useradd一致,-Ga追加附加组,-g主组的修改需要重新登录才能生效passwd:修改密码,执行者只能是root或sudo提权后的用户su:切换用户 (默认切换至root),需要输入目标用户密码,不加-l会停留在当前路径并且环境变量不变,执行exit回到原用户
默认管理组的命名不统一:Debian 系 (Debian、Ubuntu、Linux Mint) 是
sudo,而 Red Hat 系 (RHEL、CentOS、Fedora) 和传统的 Unix (如 BSD) 是wheel可以通过查看
/etc/sudoers确认%sudo ALL=(ALL:ALL) ALL%wheel ALL=(ALL:ALL) ALL
虽然你不应该知道服务器的 root 密码,但服务提供商为你准备了 sudo 组里的一个用户及其密码。sudo 是被系统认可的用户组,使用 sudo 命令就可以按照 /etc/sudoers 里 sudo 组规定的权限进行操作。
-u <username>以指定用户的身份,默认为root-i登录指定用户 (同su -l,但输入的是自己的密码)-s登录指定用户 (同su,但输入的是自己的密码)-E保留当前用户的环境变量-l查看当前用户权限
比如 nisemono 以 ubuntu 的身份将 Github 仓库 tiny-web 克隆至 /home/ubuntu/tiny-web/
> sudo -u ubuntu git clone git@github.com:user/tiny-web.git /home/ubuntu/tiny-webCloning into '/home/ubuntu/tiny-web'...remote: Enumerating objects: 5, done.remote: Counting objects: 100% (5/5), done.remote: Compressing objects: 100% (5/5), done.remote: Total 5 (delta 0), reused 5 (delta 0), pack-reused 0 (from 0)Receiving objects: 100% (5/5), done.> sudo -u ubuntu tree -L 2 /home/ubuntu//home/ubuntu/└── tiny-web ├── index.html ├── script.js └── style.css
2 directories, 3 files/etc/sudoers 的配置示例:
Host_Alias office-pc = pc1, pc2, pc3, 192.168.1.11
alice ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginxbob ALL=(ALL) ALL, !/usr/bin/passwd, !/usr/sbin/visudocharlie ALL=(ALL) SETENV: /usr/bin/python3%dba db=(postgres) /usr/bin/psql%dev office-pc=(:www-data) NOEXEC: /usr/bin/vim /var/www/html/*
# 仅允许用户 alice 在任何主机=(以任何身份) 免密重启 nginx# 允许用户 bob 在任何主机=(以任何身份) 做任何事,除了修改密码和 sudo 配置# 仅允许用户 charlie 在任何主机=(以任何身份) 运行 python3 (允许带上自己的环境变量)# 仅允许 dba 组成员 在主机 db=(以用户 postgres 的身份) 执行 sql# 仅允许 dev 组成员 在主机 pc1,pc2,pc3,192.168.1.11=(以 www-data 组的权限) 使用 vim (不允许使用内部的 execve 系统调用,防止 getshell 逃逸) 编辑 /var/www/html/ 里的所有文件,此时用户身份不变,但组权限生效# 别名User_Alias WEBADMINS = alice, bob, %devopsCmnd_Alias WEB_CMDS = /usr/bin/systemctl restart nginx, /usr/bin/systemctl reload nginxRunas_Alias WEBUSER = www-data
# 授权部分WEBADMINS ALL=(WEBUSER) WEB_CMDS身份与权限
Linux 有三种身份,每种身份拥有独立的权限设置:
u(所有者,User):文件的创建者或通过chown指定的用户g(所属组,Group):文件所属的用户组,组内所有成员共享这组权限o(其他人,Others):既不是所有者,也不属于文件所属组的其他所有用户
Linux 有三种权限:
| 权限 | 文件 | 目录 |
|---|---|---|
r(读) | cat,less,more,head,tail,grep,awk,sed(只读),vim(只读),<(重定向输出),cp | ls 浏览 (不允许长格式 -l) |
w(写) | >(覆盖),>>(追加) | 创建/删除/重命名目录下的文件 |
x(执行,进入) | 将二进制文件加载进内存并运行 | cd,解析文件路径,stat (inode 元数据:查看大小,修改时间,权限设置), |
在 ls -l 的输出里,权限的文本格式形如 -rwxr-xr--,含 10 个字符:
-/d(第 1 位):文件/目录rwx(第 2-4 位):对u(所有者) 的权限r-x(第 5-7 位):对g(所属组) 的权限r--(第 8-10 位):对o(其他人) 的权限
三种身份的权限也可以编码成 3 位八进制数,高位对应 u,中位对应 g,低位对应 o
r:4,即0b100w:2,即0b010x:1,即0b001
因此 rwxr-xr-- 也可以编码成 754 (八进制)
| 常见场景 | 权限 |
|---|---|
| 常规文件 | 644 (-rw-r--r--),不可执行,组和其他人只读 |
| 常规目录 | 755 (drwxr-xr-x),组和其他人能 cd 并 ls,但不能 touch 或 rm |
| 常规二进制 | 755 (-rwxr-xr-x),可执行,仅所有者可写 |
| 系统二进制 | 555 (-r-xr-xr-x),可执行,所有身份不可写 |
| 敏感文件 | 600,SSH 私钥,.env 环境变量 (含 API-key),数据库配置文件 |
修改文件/目录权限:
# 符号模式,+(添加),-(移除),=(只权限)# 所有者可执行,所属组不可写,其他人只读chmod u+x,g-w,o=r file.txt# 所有身份可读chmod a+r file.txt
# 数字模式,三位八进制赋值# 所有者=读写执行,所属组=读执行,其他人无权限chmod 750 folder比如让 ubuntu 用户的家目录为其他人 o 添加进入权限 x
sudo chmod o+x /home/ubuntu文本处理
grep
grep 是 Linux 中常用的文本搜索工具
# 忽略大小写,完整单词匹配,显示匹配行号grep -i -w -n error log.txt > error.txt
apt list\# 排除匹配成功行| grep -v i386\# 启用扩展正则表达式| grep -v -E "^lib.*\[.*?installed.*?\]$"\# 只显示匹配成功行数| grep python | grep -c clang# 给文本标行号 (也可以 cat -n)| nl
# 递归搜索grep -r -E - "flag{.*?}" /home/
# 指定文件后缀,显示前后行grep -r -w --include="*.py" -C 5 "def" ./src/less
less 是 Linux 中常用的文本查看器,适用于查看不支持滚屏的终端容纳不下的输出内容
less /var/log/syslogps aux | lessq退出,h帮助d/u翻半屏,SPACE/b翻一屏,j/k翻一行,←/→左右滚动g/G首尾,114g行号//?向下/上搜索,n/N下/上一个,-i大小写敏感,[ESC]u取消高亮v切换至vi编辑,保存退出后回到less
head/tail
head 和 tail 用于查看文件首尾内容 (默认 10 行),避免终端刷屏
-n 控制行数,head -n -9 舍弃末尾 9 行,tail -n +7 从第 7 行开始保留
head -n 20 sys.logapt list | tail -n +100 | head -n 50Nginx
sudo apt updatesudo apt install nginx$ systemctl status nginx● nginx.service - A high performance web server and a reverse proxy server Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; preset: enabled) Active: active (running) since Mon 2026-07-27 09:33:32 CST; 1min 1s ago Docs: man:nginx(8) Process: 1848505 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS) Process: 1848507 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS) Main PID: 1848539 (nginx) Tasks: 5 (limit: 4369) Memory: 3.8M (peak: 8.1M) CPU: 25ms CGroup: /system.slice/nginx.service ├─1848539 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;" ├─1848541 "nginx: worker process" ├─1848542 "nginx: worker process" ├─1848543 "nginx: worker process" └─1848544 "nginx: worker process"现在服务器已经正在监听 80 端口,在本地浏览器输入 http://xxx.xx.xx.xx/ (注意不是 https) 就可以使用 HTTP 协议访问服务器 nginx 的欢迎界面。
Linux 有 65535 个端口,前 1024 个端口被系统保留,常见端口如下:
端口 协议/服务 解释 21 FTP 文件传输 (明文) 协议 22 SSH 你正在使用 22 端口连接着这台服务器 53 DNS 域名解析服务 80 HTTP 网页传输 (明文) 协议 443 HTTPS 网页传输 (SSL/TLS 加密) 协议 3306 MySQL 最流行的关系型数据库 5432 PostgreSQL 更稳健的开源关系型数据库 6379 Redis 内存缓存/键值对数据库 27017 MongoDB 非关系型文档数据库 (NoSQL) 查看服务器此刻在监听哪些端口
Terminal window sudo ss -tulnp
-t/-uTCP/UDP,-n显示数字端口,-p显示进程名
/etc/nginx/ 常见:
| 文件/目录 | 功能 |
|---|---|
nginx.conf | 配置总入口,Nginx 启动时唯一直接读的文件 |
sites-available/ | 所有网站配置 |
sites-enabled/ | 当前启用的网站配置,软链至 sites-available/ |
conf.d/ | 额外的全局配置片段,nginx.conf 默认会 include |
snippets/ | 可复用的配置片段,需要时自己 include 进来 |
modules-available/ | 可用的动态模块 |
modules-enabled/ | 启用的动态模块 |
mime.types | 文件扩展名到 MIME 类型的映射表,告诉浏览器返回的是 html、png 还是别的 |
proxy_params / fastcgi_params / fastcgi.conf / scgi_params / uwsgi_params | 反向代理到后端应用时常用的参数片段,需要时 include 即可 |
ls -l查看sites-enabled/的软链情况
nginx.conf 配置 Nginx:
user www-data; # 以 www-data 组的身份访问本机的网页文件worker_processes auto; # 工作进程数与 CPU 核数一致pid /run/nginx.pid; # 进程 IDerror_log /var/log/nginx/error.log; # 日志位置include /etc/nginx/modules-enabled/*.conf; # 导入动态模块
# 并发处理参数events { # 单进程处理的最高连接数 worker_connections 768;}
# 所有跟 HTTP 服务相关的设置http { sendfile on; tcp_nopush on; types_hash_max_size 2048;
# 扩展名在 mime.types 没有对应规则时,按二进制流返回 include /etc/nginx/mime.types; default_type application/octet-stream;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on;
access_log /var/log/nginx/access.log;
gzip on; # Gzip 自动压缩,省流量
# 导入配置 include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*;}注意:
www-data不能改成高权限用户 (如ubuntu,root等),否则黑客攻破 Nginx 后就能以该用户的权限行事,他可以随意修改你的代码、删除文件,甚至执行sudo提权控制整台服务器
欢迎界面对应了服务器上的一个 HTML 文件,你可以在 /etc/nginx/sites-available/default 里找到它的位置
server { ... root /var/www/html; ... }/etc/nginx/sites-available/default 的结构:
# 一个 server 块 = 一个网站server { # 监听 80 端口 # 没有匹配其他 server 块的时候,作为默认 server 块 listen 80 default_server; listen [::]:80 default_server; # IPv6
# 用户访问到该端口时,去指定目录,按顺序优先找指定文件返回 # 记得给 www-data 组 (nginx 配置文件里设置的) 开目录权限 root /var/www/html; index index.html index.htm index.nginx-debian.html;
# 对所有域名都响应 server_name _; # example.com
# 路由规则 location / { # 先按用户要的路径找文件,找不到就当作目录找,再找不到就返回 404 try_files $uri $uri/ =404; }}配置修改完毕后,让配置生效,成功上线
sudo nginx -t # 语法检查,有错的话一定要在 reload 前改对,否则会挂sudo systemctl reload nginx # 不是 restart,不会断连服务器上的代码应当是 GitHub 仓库的镜像:所有改动都应该在本地做,通过 push/pull 同步过去,不要在服务器上手改文件