欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

nginx--Beginner's Guide

程序员文章站 2023-12-30 18:14:10
...

官网原文地址

文章包括六部分

  • 前言
  • 开始,停止,重新加载的配置
  • 配置文件的结构
  • 提供静态内容
  • 设置一个简单的代理服务器
  • 设置FastCGI代理

这篇引导是对nginx的基础介绍,通过一些简单的案例来展示nginx能做什么,默认你已经安装好nginx,否则请先进行安装,本文将介绍怎么运行/停止nginx,重新加载配置,解释配置文件的结构以及怎么设置nginx服务器提供静态内容,如何将nginx设置成代理服务器,如果连接到FastCGI应用

nginx有一个master进程和多个worker进程,master线程的目的是读取和解析配置以及维持worker进程,worker进程处理实际的工作(请求)
nginx采用基于事件的模型,和基于OS的机制来高效率地在worker之间分发请求,worker进程的数字被定义在配置文件中,可以指定配置进行固定,也可以设置成根据可用CPU内核的数量自动调整(参见worker_processes)。

nginx及其模块的工作由配置文件进行设定,默认情况下,配置文件名为 nginx.conf 一般放置在 /usr/local/nginx/conf , /etc/nginx 或者 /usr/local/etc/nginx

docker 的官方nginx镜像是存放在 /etc/nginx目录下

Starting , Stopping , and Reloading Configuration

开启nginx,只需运行可执行文件。 nginx开启后,可以通过 -s参数进行控制 例如

nginx -s singal

signal可以是下面任一

  • stop -- 快速关闭
  • quit -- 优雅地关闭(等待工作线程完成目前的请求)
  • reload -- 重新加载配置文件
  • reopen -- 重新开启日志文件

应该使用开启 nginx 的用户来执行该命令

如果配置文件发生了修改,可以运行nginx -s reload让其真正生效(否则只能通过重启令其起作用)

一旦master进程收到reload信号,会先检查新配置文件中的语法有效性,然后会尝试应用新的配置,如果顺利,master进程会开启新的工作进程,同时发送消息到旧的工作进程通知让他们关闭。否则master进程会回退修改,继续依照旧的配置工作。

旧的工作进程收到关闭命令时,会停止接收新的连接,但会继续完成已有的请求,直到所有请求处理完成,在那之后,旧工作进程才会退出

一个信号也可以通过Unix工具的帮助发送到nginx进程,例如kill , 这种情况下 一个信号被直接发送到给定进程ID的进程
master进程的进程ID会被记录下来,默认写到中 /usr/local/nginx/logs 或者 /var/runnginx.pid中,例如 master进程 ID 是 1628 可以发送QUIT信号 可以执行:

kill -s QUIT 1628

获取所有运行的nginx进程,可以使用ps 命令,例如:

ps -ax | grep nginx

关于发送信号到nginx上更详细的信息,可以查看Controlling nginx.

Configuration File's Structure

nginx包含由配置文件中指定的指令控制的模块,指令分为简单指令块指令

简单指令包含名字和参数,由空格进行分隔,并以;结尾
块指令跟简单指令有相同的结构,不过它不是以分号结束,而是以一组由({})包围的附加指令

如果块指令可以在大括号内包含其他指令,则称为上下文(context)(例子: events, http, server, and location)。

任何上下文之外的指令被认为包含在主上下文中,eventshttp指令 在主上下文中,serverhttp中, locationserver

其余以#开头的部分 是注释

Service Static Content

一个重要的web服务器任务是提供文件(例如 图片,或者静态HTML页面)你将实现一个样例,其中根据请求,将从不同的本地目录中提供文件:/data/www (一般包含静态HTML文件) /data/images (一般包含图像),这将需要编辑配置文件,然后设置 http - server -- location(两个)

首先,创建 /data/www 目录,然后放置一个 index.html文件输入一些html内容,然后创建 /data/images目录,其中放置一些图片...

接着,打开配置文件,默认配置文件以及包含一些server块的样例,主要是注释掉了。现在,请注释掉所有这些块并启动一个新的服务器块:

http{
  server{
  }
}

通常地,配置文件可能包含多个 server块,由 监听端口,服务器名进行区分
一旦nginx决定哪个server处理一个请求,会根据server中的location指令测试指定在请求的头参数中的URI

添加以下 location块到 server块中

location / {
  root /data/www;
}

location块 指定 /前缀,为了匹配请求,URI会被添加到root指令指定的路径上,即 /data/www,以规范访问本地文件系统中文件的路径。如果有多个location块符合配对,nginx会选择有最长前缀的一个,上面的location块拥有最短的前缀 / ,因此只有其他所有location块都无法配对时,才会选择该块

然后,添加第二个 location

location /images/ {
  root /data;
}

这会配对 以/imgaes/开头的请求,(/ 也能够配对,但是长度要更短)

最终的配置应该是这样:

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

    location /images/ {
        root /data;
    }
}

这已经是一个服务器的工作配置,监听标准80端口,允许本地机器访问 http://localhost/ 响应以 /images/开头的URI请求,服务器会从/data/images目录发送文件,例如,作为回答http://localhost/images/example.png 这个请求,nginx会发送 /data/images/example.png文件,如果这样的文件不存在,nginx会返回一个404错误页面,不是以/images/开头的请求URI将会映射到/data/www目录,例如 对于http://localhost/some/example.html nginx会返回/data/www/some/example.html路径上的文件(如果存在)

为了应用新配置,可以发送reload信号到 nginx的master进程,例如执行:

nginx -s reload

以防超出工作预期,你也许可以尝试查看/usr/local/nginx/logs中的 access.logerror.log文件 。 一般在/usr/local/nginx/logs或者/var/log/nginx.

Setting Up a Simple Proxy Server

最流行的一种nginx用途是将其设置成代理服务器,意味着接收请求(request),然后传递他们(request)到被代理服务器(proxied server),并将(从被代理服务器)收到的答复发送回给客户端(client)

我们会配置一个基础的代理服务器,可以处理访问本地图片文件请求,然后发送所有其他请求到代理服务器上,此例子中,两个server会被定义在一个单一的nginx实例上

首先,通过添加一个server块到nginx的配置文件中来定义被代理服务器

server {
    listen 8080;
    root /data/up1;

    location / {
    }
}

这样就设定了一个简单的监听8080端口的服务器(之前没有指定端口时,默认使用80端口),然后映射所有请求到/data/upl本地文件目录,(手动)创建这个目录,然后向其中添加index.html 文件,注意到 root指令是放置在的server上下里面,当选择了某个没有包含root指令的location块去处理一个请求,就会使用这个(server域)root指令

接下来,使用前一节中的服务器配置,并对其进行修改,使其成为代理服务器配置。首先,location块,放置proxy_pass指令,并带上 协议、名字和端口(我们的样例中是http://localhost:8080

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

    location /images/ {
        root /data;
    }
}

我们将修改第二个location块,使得其能够配对包含典型文件拓展名的请求,修改后location块:

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

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

当nginx选择一个 location块去处理一个请求,首先会检查有特定前缀的 location指令,记住符合的最长前缀的location,然后检查正则表达式,如果有符合的正则表达式,nginx选择这个location或者,否则会选择之前记住的location

意味着,正则表达式的优先级要高于长前缀的location

最终代理服务器的配置会类似:

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

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

这个服务器会过滤以.gif , .jpg , .png结尾的请求,然后将他们映射到/data/images目录(通过添加URI到root指令的参数),然后传递其他所有请求到被代理服务器上

为了应用新的配置,发送reload信号到nginx

还有其他更多的指令以满足更复杂的代理连接配置

Setting Up FastCGI Proxying

nginx可以用来路由请求到 FastCGI服务器---以多个框架和编程语言构建的应用,例如PHP

对于FastCGI服务器最主要的nginx配置 ,包括使用 fastcgi_pass指令,而不是 proxy_pass指令,以及使用 fastcgi_param指令来设置参数传递到 FastCGI服务器上,假设localhost:9000可以访问FastCGI服务器,以前一节的代理配置为基础,用fastcgi_pass指令替换proxy_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上运行的代理服务器

上一篇:

下一篇: