前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Nginx 入门教程

Nginx 入门教程

作者头像
柳公子
发布2018-09-17 16:45:21
1.2K0
发布2018-09-17 16:45:21
举报
文章被收录于专栏:PhpZendo

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 安装目录下运行可执行文件

代码语言:javascript
复制
# 启动 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 参数 的可执行命令控制

  • 语法:
代码语言:javascript
复制
# 向主进程发送信号(stop, quit, reopen, reload)
nginx -s 信号
  • 信号类型
代码语言:javascript
复制
nginx -s stop # 立即关闭
nginx -s quit # 会在处理完当前正在的请求后退出,也叫优雅关闭
nginx -s reload # 重新加载配置文件,相当于重启 nginx
nginx -s reopen # 重新打开日志文件

③ 优雅关闭 nginx

代码语言:javascript
复制
nginx -s quit

该命令将在工作进程处理完成当前的请求才结束 nginx 进程

④ 重新加载配置

如果对配置文件(nginx.conf)内容做出更改,在执行重新加载配置命令或 nginx 重启启动前,配置不会生效。

代码语言:javascript
复制
# 重新加载配置命令
nginx -s reload

重新加载配置流程

i. 主进程接收到重新加载配置信号,master 进程检查新配置文件语法有效性 ii. 在 nginx 应用中使用新配置。 iii. 如果成功,主进程启动新的工作进程;同时向旧工作进程发送关闭消息。如果失败,主进程回滚更改,继续使用就配置。 iv. 旧工作进程收到关闭信号,停止接收新的请求连接;并继续维护当前安请求直到这些请求被处理完成,旧工作进程将退出。

⑤ nginx 控制扩展阅读

i. nginx 主进程的进程 ID 默认写在 /usr/local/nginx/logs/var/run 目录下 nginx.pid 文件中。

ii. 获取所有 nginx 进程列表,可以使用 ps 命令

代码语言:javascript
复制
ps -ax | grep nginx

# 或

ps -ef | grep nginx

iii. 也可以使用 kill 工具将信号直接发送到指定的 nginx 进程 ID,如

代码语言:javascript
复制
# 如果主进程 ID 为 1268,则发送 QUIT 信号让 nginx 平滑关闭
kill -s QUIT 1268

2.3 配置文件结构

nginx 是有一些模块组成,一般在配置文件中使用具体的指令控制这些模块。

指令:可分为简单指令块级指令

① 简单指令

简单指令:由 (*指令名称 + 以空格分开的指令参数) 组成,并以分号(;) 结尾。

如:

代码语言:javascript
复制
root /data/www
② 块级指令

块级指令:与简单指令类似的结构,不过是由使用花括号({})包裹的额外指令集组成。

如果一个块级指令的花括号内有其它指令,则它被称为一个上下文(如 events, http, server, location)

在配置文件中,没有放在任何上下文中的指令都是处在主上下文中。

i. events, http, server, location 上下文关系:
  • events 和 http 的指令属于主上下文
  • server 放于 http 指令,location 放于 server 指令
ii. events, http, server, location 上下文示例:
代码语言:javascript
复制
# # 号开头的行被当作注释
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 块级指令。

代码语言:javascript
复制
http {
    server {

    }
}

通常,nginx 配置文件包含多个 server 指令。这些指令会监听不同的端口和服务器名。一旦 nginx 决定使用哪个服务器进程进行处理请求,它会根据在 server 指令中定义好的 location 指令的参数来匹配请求头中指定的 URI。

④ 在 server 块级指令中编写 location 指令

代码语言:javascript
复制
location / {
    root /data/www;
}

这条 location 指令将会在请求的 URI 中匹配 / 前缀。对于匹配的请求,URI 将被添加到 root 指令指定的路径后,即 /data/www,得到本地文件系统中请求文件的路径。

如果在一个 server 指令中有多个 location被匹配到, nginx 会选择最长的前缀

上面 location 提供了一个长度为 1 的前缀,所以仅当其它的 location 匹配失败,该指令才会使用。

⑤ 添加第二个 location 块级指令

代码语言:javascript
复制
location /images/ {
    root /data;
}

这条指令用于匹配包含 /images/ 前缀的请求( location / 也会匹配该请求,只是前缀更短)

完整的 nginx.conf 配置如下

代码语言:javascript
复制
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 的主进程,通过执行:

代码语言:javascript
复制
nginx -s reload

如果有些地方出错,可以在/usr/local/nginx/logs 或者 /var/log/nginx 目录下的 access.log 和 error.log 文件中,找到原因。

2.5 搭建代理服务器

nginx 一个常见用途是作为代理服务器,作用是当接收到请求时,将请求转发给被代理服务器,并获得被代理服务器响应,将这个响应发送会客户端。

这边我们实现一个简单的代理服务器,它将直接处理本地图片请求并响应客户端,并将其它请求转发给代理服务器。在这个示例中,两个服务器都定义在一个 nginx 配置实例中。

① 首先添加一个 server 块级指令来定于一个被代理的服务器

代码语言:javascript
复制
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

代码语言:javascript
复制
server {
    listen 8080;
    root /data/up1;

    location / {
        proxy_pass http://localhost:8080;
    }

    location /images/ {
        root /data;
    }
}

③ 接着,我们修改 第二个 location 块,目前它仅匹配查找到包含 /images/ 规则的请求到 /data/images/ 目录下。我们需要将其改写为匹配典型图片后缀名的文件请求。修改后的指令如下:

代码语言:javascript
复制
location ~ \.(gif|jpg|png)$ {
    root /data/images;
}

该指令参数 ~ .(gif|jpg|png)$ 是一个正则表达式,会匹配 .gif, .png, .jpg 结尾的 URLs。

一个正则需要以 ~ 开头。匹配到的请求将被映射到 /data/images 目录下。

当 nginx 去选择一个 location 去响应请求时,会检查带有前缀的 location 指令,记住优先检测带有最长前缀的 location 指令然后检测正则表达式。如果有一个正则的匹配规则, nginx 会选择该 location,否则,会选择之前缓存的规则。

③ 最终一个代理服务器的配置结果如下:

代码语言:javascript
复制
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 指令指定的参数)。

接着将所有其它请求映射到代理服务器。

要让新的配置起作用,需要重新加载配置文件

代码语言:javascript
复制
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 参数用于传递请求参数。最终配置为:

代码语言:javascript
复制
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 中文文档

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年1月30日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Nginx 入门教程
    • 一、安装 Nginx
      • 1.1 Linux 系统上安装
      • 1.2 FreeBSD 系统上安装
      • 1.3 Windows 系统上安装
      • 1.4 源码安装
    • 二、入门
      • 2.1 学习内容
      • 2.2 nginx 启动、停止和重新加载配置
      • 2.3 配置文件结构
      • 2.4 静态服务器
      • 2.5 搭建代理服务器
      • 2.6 搭建 FastCGI 代理
    • 扩展
      • 参考资料
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档