Nginx 入门教程

Nginx 入门教程

一、安装 Nginx

1.1 Linux 系统上安装

1.2 FreeBSD 系统上安装

1.3 Windows 系统上安装

1.4 源码安装

二、入门

2.1 学习内容

① 学习内容列表

  • 启动、停止 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 上运行的代理服务。

扩展

  1. service 启动和 nginx 启动区别?

  2. nginx -s stop 与 nginx -s quit 区别

参考资料

深入 Nginx:我们是如何为性能和规模做设计的

Nginx 核心模块

运行和控制Nginx

nginx 基本入门

nginx 中文文档

发表评论

电子邮件地址不会被公开。 必填项已用*标注