心蓝的博客 心蓝的博客
首页
  • 零基础

    • python零基础入门
  • 专项

    • 正则表达式
  • web框架

    • django框架
    • drf
技术
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档

心蓝

人生苦短,我用python
首页
  • 零基础

    • python零基础入门
  • 专项

    • 正则表达式
  • web框架

    • django框架
    • drf
技术
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
  • pycharm激活码
  • docker基础
  • Dockerfile
  • docker-compose
  • nginx介绍
  • nginx初学者指南
    • 启动、停止和重新加载配置
    • 配置文件的结构
    • 服务静态内容
    • 设置一个简单的代理服务器
    • 设置FastCGI代理
  • nginx如何处理一个请求
  • nginx服务名称详解
  • 使用nginx作为http负载均衡器
  • 配置HTTPS服务器
  • 技术
心蓝
2022-06-04
目录

nginx初学者指南

# 初学者指南

本指南对nginx做了一个基本的介绍,并描述了一些可以用它完成的简单任务。假设nginx已经安装在读者的机器上了。如果不是,请参见安装nginx (opens new window)。这个指南描述了如何启动和停止nginx,以及重新加载其配置,解释配置文件的结构,并描述如何设置 nginx 以提供静态内容,如何将 nginx 配置为代理服务器,以及如何将其连接到FastCGI 应用程序。

Nginx有一个主进程和几个工作进程。主进程的主要目的是读取和评估配置,以及维护工作进程。工作进程对请求进行实际处理。nginx 采用基于事件的模型和依赖于操作系统的机制来有效地在工作进程之间分配请求。工作进程的数量在配置文件中定义,并且可以针对给定的配置进行固定或自动调整为可用 CPU 内核的数量(请参阅 worker_processes (opens new window))。

nginx 及其模块的工作方式在配置文件中确定。默认情况下,配置文件被命名nginx.conf 并放置在目录 /usr/local/nginx/conf、 /etc/nginx或 /usr/local/etc/nginx中.

# 启动、停止和重新加载配置

启动nginx,运行可执行文件。nginx一旦启动,就可以通过-s参数调用可执行文件来控制它。语法如下:

nginx -s signal
1

其中,signal可能是下列其中之一:

  • stop: 快速关闭
  • quit: 优雅关闭
  • reload: 重新加载配置文件
  • reopen: 重新打开日志文件

例如,停止nginx进程,等待工作进程完成当前请求的服务,可以执行以下命令:

nginx -s quit
1

该命令应该在启动nginx的同一用户下执行。

修改配置文件后,需要运行重新加载配置命令或者重启nginx后才会生效。重新加载配置命令如下:

nginx -s reload
1

一旦主进程接收到重新加载配置的信号,它会检查新配置文件的语法有效性,并尝试应用其中提供的配置。如果检查成功,主进程启动新的工作进程,并向旧的工作进程发送消息,要求他们关闭。否则,主进程回滚更改并继续使用旧配置。旧的worker进程,接收到关闭的命令,停止接受新的连接,并继续服务当前的请求,直到所有这些请求都得到服务。之后,老的worker进程退出。

在Unix工具(如kill工具)的帮助下,信号也可以发送到nginx进程。在这种情况下,信号被直接发送到具有给定进程ID的进程。默认情况下,nginx主进程的进程号会被写入/usr/local/nginx/logs或/var/run目录下的nginx.pid文件。

例如,如果主进程 ID 是 1628,要发送导致 nginx 正常关闭的 QUIT 信号,请执行:

kill -s QUIT 1628
1

要获取所有正在运行的nginx进程的列表,可以使用ps工具,例如:

ps -ax | grep nginx
1

关于发送信号到nginx的更多信息,请参见控制nginx (opens new window)。

# 配置文件的结构

Nginx由模块组成,这些模块由配置文件中指定的指令控制。指令分为简单指令和块指令。一个简单的指令由名称和参数组成,用空格隔开,以分号(;)结束。块指令与简单指令具有相同的结构,但它不是以分号结尾,而是以一组由大括号 ({和}) 包围的附加指令。如果块指令可以在大括号内包含其他指令,则称为上下文(例如: events (opens new window)、 http (opens new window)、 server (opens new window)和 location (opens new window))。

放在任何上下文之外的配置文件中的指令被认为是在主上下文中。events和http指令在主上下文中,server在http中,location在server中。

#号后面的一行被认为是注释。

# 服务静态内容

一个重要的 Web 服务器任务是提供文件(例如图像或静态 HTML 页面)。您将实现一个示例,根据请求,文件将从不同的本地目录提供服务:(/data/www 可能包含 HTML 文件)和/data/images (包含图像)。这将需要编辑配置文件,然后在http指令块中设置一个server块,server块中包含2个location块。

首先,创建/data/www目录,并将一个包含任何文本内容的index.html文件放入其中,然后创建/data/images目录,并将一些图像放入其中。

接下来,打开配置文件。默认的配置文件已经包含了几个服务器块的例子,大多数都被注释掉了。现在,注释掉所有这些块,并启动一个新的server块:

http {
    server {
    }
}
1
2
3
4

通常,配置文件可能包括几个 server块 ,这些块由它们监听的端口和服务器名称来区分 。一旦nginx决定由哪个服务器来处理一个请求,它用server块中定义的location指令的参数来测试请求头中指定的URI。

将以下location块添加到server块中:

location / {
    root /data/www;
}
1
2
3

这个location块指定了与请求的URI相比较的前缀/。对于匹配请求,URI 将添加到 root (opens new window) 指令中指定的路径,也就是说,添加到/data/www上,在本地文件系统上形成请求文件的路径。如果有多个匹配的位置块,nginx选择前缀最长的那个。上面的location块提供了长度为1的最短前缀,因此只有当所有其他location块都不能提供匹配时,才会使用这个location块。

接下来,添加第二个位置块:

location /images/ {
    root /data;
}
1
2
3

它将匹配以/images/开头的请求(location /也匹配这样的请求,但是前缀更短).

服务器块的最终配置应该是这样的:

server {
    location / {
        root /data/www;
    }

    location /images/ {
        root /data;
    }
}
1
2
3
4
5
6
7
8
9

这已经是服务器的一个工作配置,该服务器侦听标准端口80,并可在本地机器上通过http://localhost访问。响应uri以/images/开头的请求,服务器将从/data/images目录发送文件。例如,在响应http://localhost/images/example.png请求时,nginx将发送/data/images/example.png文件。如果这样的文件不存在,nginx将发送一个响应指示404错误。uri不是以/images/开头的请求将被映射到/data/www目录。例如,为了响应http://localhost/some/example.html请求,nginx将发送/data/www/some/example.html文件。

为了应用新配置,启动nginx,如果它还没有启动,或者发送reload信号到nginx的主进程,命令如下:

nginx -s reload
1

如果有些东西不像预期的那样工作,你可以尝试在/usr/local/nginx/logs或/var/log/nginx目录下的access.log和error.log文件中找出原因。

# 设置一个简单的代理服务器

nginx的一个常用用法是将它设置为代理服务器,这意味着服务器接收请求,将它们传递给代理服务器,从它们获取响应,并将它们发送给客户机。

我们将配置一个基本的代理服务器,它使用本地目录的文件为请求图片的请求服务,然后将所有其他请求发送到代理服务器。在这个例子中,两个服务器都定义在一个nginx实例上。

首先,定义被代理服务器,在nginx的配置文件中添加一个sever块,内容如下:

server {
    listen 8080;
    root /data/up1;

    location / {
    }
}
1
2
3
4
5
6
7

这将是一个侦听端口8080的简单服务器(在此之前,没有指定listen指令,因为使用了标准端口80),并将所有请求映射到本地文件系统上的/data/up1目录。创建这个目录并将index.html文件放入其中。注意根指令是放在server上下文中的。当选择处理请求的location块不包含它自己的root指令时,使用这样的root指令。

接下来,使用上一节中的服务器配置,并将其修改为代理服务器配置。在第一个location块中,将proxy_pass指令与参数中指定的代理服务器的协议、名称和端口放在一起(在我们的例子中,它是http://localhost:8080):

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

    location /images/ {
        root /data;
    }
}
1
2
3
4
5
6
7
8
9

我们将修改第二个location块,现在它将使用/images/前缀的请求映射到/data/images目录下的文件,以使其匹配具有典型文件扩展名的图像的请求。修改后的location块看起来像这样:

location ~ \.(gif|jpg|png)$ {
    root /data/images;
}
1
2
3

该参数是一个正则表达式,匹配所有以.gif、.jpg或.png结尾的uri。正则表达式前面应该有~。相应的请求将被映射到/data/images目录。

当nginx选择一个location块来服务一个请求时,它首先检查指定了前缀的location指令,记住是有最长前缀的location,然后检查正则表达式。如果与正则表达式匹配,Nginx会选择这个location,否则,它会选择之前记住的那个location。

代理服务器的最终配置如下:

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

    location ~ \.(gif|jpg|png)$ {
        root /data/images;
    }
}
1
2
3
4
5
6
7
8
9

该服务器将过滤以.gif、.jpg或.png结尾的请求,并将它们映射到/data/images目录(通过将URI添加到根指令的参数),并将所有其他请求传递到上面配置的被代理服务器。

要应用新的配置,发送重新加载信号到nginx,如前面章节所述。

还有更多的指令可以用来进一步配置代理 (opens new window)连接。

http://nginx.org/en/docs/beginners_guide.html

# 设置FastCGI代理

nginx可以用来将请求路由到FastCGI服务器,FastCGI服务器运行用各种框架和编程语言(如PHP)构建的应用程序。

在使用FastCGI服务器时,最基本的nginx配置是使用fastcgi_pass指令代替proxy_pass指令,以及使用fastcgi_param (opens new window) 指令来设置传递给 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;
    }
}
1
2
3
4
5
6
7
8
9
10
11

这将设置一个服务器,它将除了静态图像请求之外的所有请求通过 FastCGI 协议路由到运行在localhost:9000上的被代理服务器。

本文完,感谢你的耐心阅读,如有需要可加我微信,备注「博客」并说明原因,我们一起进步,下次见。

上次更新: 2023/04/17, 14:40:57
nginx介绍
nginx如何处理一个请求

← nginx介绍 nginx如何处理一个请求→

最近更新
01
requests让接口测试如此简单 原创
03-31
02
最简明的python正则教程
03-30
03
pycharm激活码
12-30
更多文章>
Theme by Vdoing | Copyright © 2019-2025 心蓝
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式