快速上手 nginx
nginx 是一个 Web 服务器和反向代理。本文用最少的步骤在 Debian 或 Ubuntu 上发布一个静态页面,说明每一步的作用,最后给出反向代理的最小配置。
nginx 的用途
- Web 服务器:发布静态网页。本文的主要内容。
- 反向代理:把请求转发给后端程序。见文末。
- 负载均衡:把请求分配给多个后端。
安装 nginx
更新软件包列表:
bashsudo apt update安装 nginx:
bashsudo apt install nginx确认 nginx 正在运行。输出中应有
active (running):bashsystemctl status nginx
写一个页面
用 vim 创建
index.html:bashvim index.html按
i,进入输入模式。输入
hello XD。按
Esc,回到普通模式。输入
:wq,按 Enter。:进入命令模式,w表示写入(write),q表示退出(quit)。
vim 的完整用法见 vim 文档。
把页面放到网站目录
创建网站目录:
bashsudo mkdir -p /var/www/myWebsite把
index.html移到网站目录。这个目录属于 root,所以要用sudo:bashsudo mv index.html /var/www/myWebsite/
配置文件的位置
nginx 的主配置文件是 /etc/nginx/nginx.conf。它控制 nginx 的全局行为:
- 全局设置,例如用户、进程数和日志;
- HTTP 模块的设置,例如 gzip、缓存和连接超时;
- 用
include指令加载的子配置文件; - 服务器块(
server {})和位置块(location {})。
nginx 启动时先读取这个文件,再按其中的 include 指令加载其他配置文件。Debian 和 Ubuntu 用下面三个目录存放子配置:
/etc/nginx/conf.d/:放以.conf结尾的配置文件。nginx 自动加载conf.d/*.conf。/etc/nginx/sites-available/:放可用的站点配置。这里的配置不会自动启用。/etc/nginx/sites-enabled/:放已启用的站点配置,通常是指向sites-available中文件的软链接。
本文只使用 conf.d。
打开
/etc/nginx/nginx.conf,确认http块中有下面三行:nginxinclude /etc/nginx/mime.types; include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*;
写站点配置
注
Debian 和 Ubuntu 安装 nginx 时,会在 sites-enabled 中启用一个默认站点。用 IP 地址访问时,这个默认站点先响应请求,你只能看到 nginx 的欢迎页。下面的第 1 步停用这个默认站点。
删除默认站点的软链接。这一步只删除链接,
sites-available/default仍然保留:bashsudo rm /etc/nginx/sites-enabled/default创建站点配置文件:
bashsudo vim /etc/nginx/conf.d/hello.conf写入下面的内容,保存并退出:
nginxserver { listen 80; server_name localhost; root /var/www/myWebsite; index index.html; location / { try_files $uri $uri/ =404; } }
每一行的作用:
listen 80;:监听 HTTP 的 80 端口。server_name localhost;:站点的名字。测试时用localhost,正式使用时改成域名。root /var/www/myWebsite;:网站根目录。index index.html;:访问目录时返回的文件。location / { try_files ... }:请求的文件不存在时,返回 404。
测试配置并重载
检查配置的语法:
bashsudo nginx -t确认输出中有下面这一行。如果没有,按输出中的错误信息修改配置:
textnginx: configuration file /etc/nginx/nginx.conf test is successful重载 nginx,使配置生效:
bashsudo systemctl reload nginx在浏览器中访问服务器的 IP 地址。页面应显示
hello XD。
注
nginx -t 只检查语法,不使配置生效。只有 reload 才使配置生效。reload 不会断开现有连接。如果修改配置后没有效果,检查是否忘记了 reload。
一次请求的过程
浏览器访问 http://ip/ 时,请求按下面的顺序处理:
- 请求到达 80 端口。
- nginx 根据
listen和server_name选择一个 server 块。 - nginx 用
location匹配请求路径。 - nginx 把
root和请求路径拼成文件路径,用try_files依次查找文件。
出错时,按这个顺序检查:
nginx -t报错:配置文件有语法错误。- 返回 404:拼出的文件路径不存在。
- 返回 403:nginx 没有读取文件的权限。
conf.d 中的每个 server {} 是一个虚拟主机。同一个 80 端口可以有多个站点。nginx 用请求头中的域名匹配 server_name,从而区分这些站点。
下一步:反向代理
反向代理把请求转发给后端程序,例如运行在 3000 端口的 Node 服务。nginx 接收所有请求,再转发给后端。对外只开放 80 和 443 端口。nginx 还可以处理 HTTPS、缓存和负载均衡。最小配置如下:
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}两行 proxy_set_header 把访客的域名和 IP 地址传给后端。没有这两行,后端看到的所有请求都来自 nginx。
使用 sites-available
如果要使用 sites-available 和 sites-enabled,把配置文件放在 sites-available 中,再创建软链接:
sudo ln -s /etc/nginx/sites-available/hello.conf /etc/nginx/sites-enabled/hello.conf本文的初版由 sheepkinn 编写,见他的仓库。