① 学习内容列表
- 启动、停止 nginx 和重新加载配置
- 学习配置文件结构
- 如何设置 nginx 以提供静态内容服务
- 如何配置 nginx 作为代理服务器
- 如何将 nginx 连接到 FastCGI 应用程序
② nginx 进程模型
- 一个主进程(master): 主要目的是读取和评估配置,创建和维护工作进程
- 一组工作进程(worker): 主要处理请求
- 辅助进程(Cache Manager, Cache Loader)
③ nginx 主进程如何确定需要创建的 worker 进程个数的?
Nginx 推荐配置的工作进程数为 CPU 内核个数,这样可以确保硬件资源有效利用,在配置文件中设置 worder_processes auto 将自动调整工作进程数。
④ 默认配置文件路径
配置文件描述了 nginx 及其模块的工作方式。
默认配置文件名为: nginx.conf 默认配置文件路径: /usr/local/nginx/conf, /etc/nginx 或 /usr/local/etc/nginx
2.2 nginx 启动、停止和重新加载配置① 启动 nginx
在 nginx 安装目录下运行可执行文件
# 启动 nginx 说明
/your/nginx/install/path/nginx -c /your/nginx/config-path/nginx.conf
# 测试机器实际启动命令
/usr/sbin/nginx -c /etc/nginx/nginx.conf
# 如果使用默认 nginx.conf,运行
/usr/sbin/nginx
② 控制 nginx
当 nginx 启动后,可以通过 -s 参数 的可执行命令控制
- 语法:
# 向主进程发送信号(stop, quit, reopen, reload)
nginx -s 信号
- 信号类型
nginx -s stop # 立即关闭
nginx -s quit # 会在处理完当前正在的请求后退出,也叫优雅关闭
nginx -s reload # 重新加载配置文件,相当于重启 nginx
nginx -s reopen # 重新打开日志文件
③ 优雅关闭 nginx
nginx -s quit
该命令将在工作进程处理完成当前的请求才结束 nginx 进程
④ 重新加载配置
如果对配置文件(nginx.conf)内容做出更改,在执行重新加载配置命令或 nginx 重启启动前,配置不会生效。
# 重新加载配置命令
nginx -s reload
重新加载配置流程
i. 主进程接收到重新加载配置信号,master 进程检查新配置文件语法有效性 ii. 在 nginx 应用中使用新配置。 iii. 如果成功,主进程启动新的工作进程;同时向旧工作进程发送关闭消息。如果失败,主进程回滚更改,继续使用就配置。 iv. 旧工作进程收到关闭信号,停止接收新的请求连接;并继续维护当前安请求直到这些请求被处理完成,旧工作进程将退出。
⑤ nginx 控制扩展阅读
i. nginx 主进程的进程 ID 默认写在 /usr/local/nginx/logs 或 /var/run 目录下 nginx.pid 文件中。
ii. 获取所有 nginx 进程列表,可以使用 ps 命令
ps -ax | grep nginx
# 或
ps -ef | grep nginx
iii. 也可以使用 kill 工具将信号直接发送到指定的 nginx 进程 ID,如
# 如果主进程 ID 为 1268,则发送 QUIT 信号让 nginx 平滑关闭
kill -s QUIT 1268
2.3 配置文件结构
nginx 是有一些模块组成,一般在配置文件中使用具体的指令控制这些模块。
指令:可分为简单指令和块级指令
① 简单指令
简单指令:由 (*指令名称 + 以空格分开的指令参数) 组成,并以分号(;) 结尾。
如:
root /data/www
② 块级指令
块级指令:与简单指令类似的结构,不过是由使用花括号({ 和 })包裹的额外指令集组成。
如果一个块级指令的花括号内有其它指令,则它被称为一个上下文(如 events, http, server, location)
在配置文件中,没有放在任何上下文中的指令都是处在主上下文中。
i. events, http, server, location 上下文关系:
- events 和 http 的指令属于主上下文
- server 放于 http 指令,location 放于 server 指令
ii. events, http, server, location 上下文示例:
# # 号开头的行被当作注释
events {
worder_connections 4096; ## 默认值 1024
}
http {
server{
listen 80;
server_name domain1.com www.domain1.com;
access_log logs/domain1.access.log main;
root html;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:1025;
}
}
}
2.4 静态服务器
Web 服务器的一个重要任务就是提供文件(比如图片或静态 HTML 文件)服务。
这边将实现一个具体示例:依据不同的 HTTP 请求,服务器将请求映射到不同的目录: /data/www(放置 HTML 文件) 和 /data/images(放置图片)。
要实现这样的功能,需要对配置文件进行编辑,并向 http 块级指令 下的 server 块级指令中加入两个 location 块级指令。
① 首先,创建一个 /data/www 目录,并放置一个实现写好内容的 index.html 文件
② 接着,创建一个 /data/images 目录,并放置一些图片
③ 打开 nginx.conf 配置文件,该文件默认已经包含 server 指令样式注释它,加入下面的 server 块级指令。
http {
server {
}
}
通常,nginx 配置文件包含多个 server 指令。这些指令会监听不同的端口和服务器名。一旦 nginx 决定使用哪个服务器进程进行处理请求,它会根据在 server 指令中定义好的 location 指令的参数来匹配请求头中指定的 URI。
④ 在 server 块级指令中编写 location 指令
location / {
root /data/www;
}
这条 location 指令将会在请求的 URI 中匹配 / 前缀。对于匹配的请求,URI 将被添加到 root 指令指定的路径后,即 /data/www,得到本地文件系统中请求文件的路径。
如果在一个 server 指令中有多个 location被匹配到, nginx 会选择最长的前缀 。
上面 location 提供了一个长度为 1 的前缀,所以仅当其它的 location 匹配失败,该指令才会使用。
⑤ 添加第二个 location 块级指令
location /images/ {
root /data;
}
这条指令用于匹配包含 /images/ 前缀的请求( location / 也会匹配该请求,只是前缀更短)
完整的 nginx.conf 配置如下
http {
server {
loation / {
root /data/www;
}
location /images/ {
root /data;
}
}
}
这已经是一个可用的服务器配置,默认监听 80 端口,本地通过 http://localhost/ 访问。
对于 URI 中包含 /images/ 前缀的请求,服务器会从 /data/images 目录中找到返回对应文件。如,当收到 http://localhost/images/example.php 请求,会获取 /data/images/example.png 文件响应这个请求。而如果文件不存在,nginx 会返回一个 404 错误响应。
当请求中没有 /images/ 前缀定位信息时,会直接映射到 /data/www 目录中。如 响应 http://localhost/some/example.html 的请求,nginx 会发送 /data/www/some/example.html 文件。
⑥ 重新加载配置
为了使用新的配置文件,如果还没开启 nginx 需要先开启,然后将重载信号发送给 nginx 的主进程,通过执行:
nginx -s reload
如果有些地方出错,可以在/usr/local/nginx/logs 或者 /var/log/nginx 目录下的 access.log 和 error.log 文件中,找到原因。
2.5 搭建代理服务器nginx 一个常见用途是作为代理服务器,作用是当接收到请求时,将请求转发给被代理服务器,并获得被代理服务器响应,将这个响应发送会客户端。
这边我们实现一个简单的代理服务器,它将直接处理本地图片请求并响应客户端,并将其它请求转发给代理服务器。在这个示例中,两个服务器都定义在一个 nginx 配置实例中。
① 首先添加一个 server 块级指令来定于一个被代理的服务器
server {
listen 8080;
root /data/up1;
location / {
}
}
上面就是一个简单的服务器,监听 8080 端口(前面的静态服务器没有定义该指令,是因为默认监听的是 80 端口),并会映射所有请求给本地目录 /data/up1。创建该目录并添加 index.htlm 文件。
需要注意的是 root 指令是放置在 server 指令上下文中,当响应请求的 location 区块没有自己的 root 指令,会向上查找并使用 server 指令中的 root 指令。
② 在前面静态服务器中定义的 server 配置,我们可以直接使用,但是需要添加一个 proxy_pass 指令到第一个 location 块,proxy_pass 指令由被代理服务器协议,名称和端口号等参数组成(这边,就是 http://localhost:8080)
server {
listen 8080;
root /data/up1;
location / {
proxy_pass http://localhost:8080;
}
location /images/ {
root /data;
}
}
③ 接着,我们修改 第二个 location 块,目前它仅匹配查找到包含 /images/ 规则的请求到 /data/images/ 目录下。我们需要将其改写为匹配典型图片后缀名的文件请求。修改后的指令如下:
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
该指令参数 ~ .(gif|jpg|png)$ 是一个正则表达式,会匹配 .gif, .png, .jpg 结尾的 URLs。
一个正则需要以 ~ 开头。匹配到的请求将被映射到 /data/images 目录下。
当 nginx 去选择一个 location 去响应请求时,会检查带有前缀的 location 指令,记住优先检测带有最长前缀的 location 指令,然后检测正则表达式。如果有一个正则的匹配规则, nginx 会选择该 location,否则,会选择之前缓存的规则。
③ 最终一个代理服务器的配置结果如下:
server {
listen 8080;
root /data/up1;
location / {
proxy_pass http://localhost:8080;
}
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
}
该服务器会选择以 .gif, .png, .jpg 结尾的 URLs 请求映射到 /data/images/ 目录下(通过 root /data/images 指令指定的参数)。
接着将所有其它请求映射到代理服务器。
要让新的配置起作用,需要重新加载配置文件
nginx -s reload
还有更多与代理有关的指令,可以进一步配置代理连接。
2.6 搭建 FastCGI 代理nginx 可以被用于将请求路由到使用了 FastCGI 服务作为通信的内置应用框架和编程语言。
一个基本的用于 FastCGI 代理的 nginx 服务器配置是使用 [fastcgi_pass]() 指令,替代前面代理服务器配置中使用的 proxy_pass 指令。另外,使用 [fastcgi_param] 指令设置需要传递给 FastCGI 服务的参数。
假定有一个可以在 http://localhost:9000 上反问的 FastCGI 服务。已上节代理服务器配置为基础,用 fastcgi_pass 指令替换 proxy_pass 指令,并将指令参数更改为 http://localhost:9000。
在 PHP 中,SCRIPT_FILENAME 参数用于确定脚本名次, QUERY_STRING 参数用于传递请求参数。最终配置为:
server {
listen 9000;
root /data;
location / {
fastcgi_pass http://localhost:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
}
location ~ \.(.gif|jpg|png) {
root /data/images;
}
}
设置设置一个 server 块指令,将所有非静态图片请求之外的所有请求路由到使用 FastCGI 协议的在 http://loaclhost:9000 上运行的代理服务。
扩展- service 启动和 nginx 启动区别?
- nginx -s stop 与 nginx -s quit 区别
深入 Nginx:我们是如何为性能和规模做设计的
Nginx 核心模块
运行和控制Nginx
nginx 基本入门
nginx 中文文档