前端了解一些基础的 Ngnix 操作,知道 Ngnix 一些基础概念,在日常开发中会更加方便, 应对多变的服务端场景也会更加从容,搜了一下发现关于 Nginx 的概览教程中文资源不太好找,找到官网有个初学者简单概览,比 AI 生成的要好上一点,翻译一下给自己做个记录。
正文开始: 这个教程是一个基础的 nginx 介绍,说明一些 ngnix 能够做的简单任务, 假定读者已经在你的电脑上安装好了 nginx, 如果你没有安装, 请自行安装, 这个教程阐述了如何开启,停止,重启配置,解释配置文件的结构,如何设置 nginx 为我们的基础内容服务,如何配置 nginx 作为代理服务, 如何关联 FastCGI 应用
nginx 由一个主线程,和几个 woker 线程组成,主线程主要的任务就是读取并计算配置和维护 woker 线程, woker 线程进行具体的请求操作, nginx 采用事件模型 和 操作系统的机制 来在 woker 线程中高效的分配请求,woker 线程的数量可以在配置文件中指定,可以指定为固定的线程数或者自动适配 CPU 的内核数
nginx 和它的工作模块的工作方式取决于他的配置文件,默认的配置文件名字是 nginx.conf, 位置在目录 /usr/local/nginx/conf / /etc/nginx / /usr/local/etc/nginx
开启, 停止,以及重启配置
nginx 通过执行可执行文件开启,一旦 nginx 开启, 他可以通过 使用 -s 参数执行命令控制, 语法如下
nginx -s signal
signal 可以是下面任一关键字
- stop --- 快速停止
- quit --- 优雅的停止
- reload --- 重新加载配置文件
- reopen --- 重新打开日志文件
例如, 等待当前正在请求的 woker 线程完成后停止 nginx 进程, 可以使用下面的命令
nginx -s quit
这个命令应该在与开启 nginx 的同个用户下执行
修改配置文件后,不会马上生效,一直到重新加载配置文件或者重新启动nginx后才会生效, 重新加载配置文件,执行下面的命令
nginx -s reload
一旦主线程收到信号去重加载配置文件, 它会检查新的配置文件的语法,并且应用配置项,如果成功,主线程会开启一条新的 woker 线程, 并且发送信号给旧的 woker 线程, 请求关闭旧的线程。否则, 主线程会回退修改,然后继续保持旧线程的工作状态。 旧 woker 线程收到关闭命令后,停止接受新的连接,并且在当前请求处理完毕以后关闭
信号也可以通过 Unix 工具, 比如 kill 命令,发送到 nginx 进程, 这里有个通过进程 id 发送的例子, nginx 主进程的 id 默认情况下会写入 /usr/local/nginx/logs 或者 /var/run 目录中的 nginx.pid, 例如, 如果主进程的 id 是 1628,发送退出信号让 nginx 优雅的退出,可以执行以下命令
kill -s QUIR 1628
如果要获取所有正在运行的 nginx 进程, ps 工具可能会帮到你, 例如, 通过以下方式
ps -ax | grep nginx // 通过管道符传递结果
更多关于信号的内容, 请查看 Controlling nginx
配置文件的结构
nginx 由模块组成, 每个模块又被配置文件中的指令控制,指令又分为简单指令, 和块指令。 简单指令由名称与空格分割,分号结尾的参数组成。 块指令跟简单指令有着相同的结构,但是他的结尾不是一个分号, 而是 被一个 大括号 包裹的额外说明集合,如果一个块指令嵌套了其他的指令,就会被称为 context (例如: events, http, server,和 location)
在配置文件中位于任何上下文(context)之外的指令,被认为是在主上下文(context)中,event, http 指令在 main 上下文中, server 在 http中, location 在 server 中
一行中, 处于符号 # 后面的文本是注释
静态内容服务
文件服务是一个很重要的服务,(比如图片和静态的 HTML 页面), 你将要实现一个示例,这个示例取决于不同的请求,例如,文件存放在不同的本地目录中,/data/www (这里存放着HTML文件) 和 /data/images (这里是图片). 这需要在配置文件中, 设置 http 块里面的 server 块里面的两个 location 块
首先新建/data/www 目录, 把任意内容的 index.html 放进去,再新建 /data/images ,放一些图片进去
然后打开配置文件,默认配置文件中已经有几个 server 块示例, 大部分都被注释了,现在注释掉所有的块,并写一个新的 server 块
http {
server {
}
}
总的来说, 配置文件可以有好多个 server 块, 他们根据监听的端口和 server name 来分发, 一旦 nginx 决定了那个 server 来处理请求, 它会根据定义在 server 块里的 location 指令的参数来测试 请求头中指定的 URL
添加下面的 location 块到 server 里面
location / {
root /data/www;
}
这个 location 块指定了与请求中的URL比对的/前缀,为了匹配请求,这个URL会被添加到 root 指令指定的路径中去,即/data/www, 组成一个在本地文件系统上请求文件的路径。如果有多个location 块被选中,nginx 会选择其中最长的一个前缀,上面的例子中是一个最短的前缀,长度只有1,只有所有其他的 location 块不被选中时,它才会被使用。
下面,添加第二个 location 块
location /images/ {
root /data;
}
这个块指令会选中 /images/ 开头的请求,(location / 也会选中,但是它的前缀更短)
配置文件中的 server 块结果是这样的
server {
location / {
root /data/www;
}
location /images/ {
root /data;
}
}
这已经是一个可行的监听默认端口80的服务配置,它可以在本地机器的http://localhost/ 上访问,发起images/ 开头的请求,它会返回 、data/images 目录里面的文件,例如, 请求 http://localhost/images/example.png nginx 会返回 /data/images/example.png 文件, 如果这个文件不存在, nginx 会返回一个 404 错误 ,不以imaegs/ 开头的请求,会被发送到 /data/www 目录,例如, 请求http://localhost/some/example.html nuinx会返回 data/www/some/example.html 文件
若要应用新的配置,如果你还没开启 nginx ,那就开启它, 如果开启了,那就发送 reload 信号到nginx 的主线程,通过执行以下命令:
nginx -s relload
如果运行的结果不及预期(报错或者其他的一些意外), 你可以尝试查看 在 /usr/local/nginx/logs 或者 /var/log/nginx 的 access.log 和 error.log 文件
设置一个简单的代理服务
nginx 其中一个经常被使用的设置就是代理服务,代理服务就是接收一个请求,然后把请求转发到代理的服务中去,从代理服务中获取响应,并把响应返回到原来的客户端。
我们会配置一个基础的代理服务, 这个服务会用本地目录的文件来服务图片请求,然后把其他的请求发送到被代理的服务器,在这个例子中,两个服务都会被定义在一个 nginx 示例里面
首先, 通过在 nginx 配置文件里添加一个 server 块来定义一个被代理的服务, 内容如下:
server {
listen 8080;
root /data/upl;
location / {
}
}
这会变成一个监听8080端口的简单服务(备注:listen 指令没有指定端口的时候,就是80),它会把所有的请求都映射到 /data/upl 的本地文件系统目录, 新建这个目录, 然后把 index.html 文件放进去,注意 root 指令放在啊了 server 上下文中, 这个 root 指令只有当里面被选中的location 块中的没有root 指令时,才会被应用
然后,使用上一个服务配置并修改,使它成为一个代理服务配置, 在第一个location 块中, 写入 proxy_pass 指令, 并带入协议,名字和被代理服务的端口参数。(在我们的例子中,就是 http://localhost:8080);
server {
location / {
proxy_pass http://localhost:8080;
}
location /image/ {
root /data;
}
}
我们将修改第二个 location 块,当前块会把带有/images/前缀的请求映射到/data/images/
目录下的文件,让他匹配拥有典型的文件扩展的图片请求, 修改后的location快如下:
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
这个参数是一个匹配任何以 .gif .jpg .png 结尾URL的正则表达式, 一个正则表达式应该在 ~ 后面,相应的请求将会映射到 /data/images 目录
当nginx选择一个location块去服务请求时,它首先会检查 指定前缀的 location 指令, 记住最长的 location 前缀, 然后检查正则表达式,如果正则表达式匹配上了, nginx 就会选择这个 location, 否则,就会选择上一个记住的。
下面的完整的代理服务配置代码:
server {
location / {
proxy_pass http://localhost:8080/;
}
location ~ .(gif|jpg|png)$ {
root /data/images;
}
}
这个服务会过滤以 .gif, .jpg, 或者 .png结尾的请求,并将它们映射到 /data/images 目录(通过添加root指令的URL参数),然后把其他的请求都转移到上面配置的被代理服务。
应用新的配置,跟上一节说到的一样, 发送 reload 信号到nginx
在未来的代理链接配置中, 还有很多有用的指令。
设置 FastCGI 代理
nginx 可以将请求路由到 FastCGI 服务,这些服务器运行着各种各样的框架和编程语言(例如PHP)构建的应用成语。
FastCGI 服务最基础的 nginx 配置,包括使用 fastcgi_pass 指令代替 proxy_pass 指令,和fastcgi_param 指令设置传递给 FastCGI 服务的参数。假定,FastCGI 服务可以在 localhost:9000 访问, 把上一节的代理配置的基础上,把 proxy_pass 指定 改为 fastcgi_pass 指令,把参数修改为 localhost:9000。 在 PHP 中, SCRIPT_FILENAME 参数 用来定义一个脚本的名字,QUERY_STRING 这个参数用来传递请求参数,配置的结果将会是这个样子:
server {
location / {
fastcgi_pass localhost:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
}
location ~ .(gif|jpg|png)$ {
root /data/images;
}
}
这将设置一个服务器,该服务器将把除了对静态图像的请求之外的所有请求通过 FastCGI 协议路由到在localhost:9000上运行的代理服务器。
原文地址: Beginner’s Guide