nginx 学习笔记(2) nginx新手入门

时间:2021-11-08 19:12:21

这篇手册简单介绍了nginx,并提供了一些可以操作的简单的工作。前提是nginx已经被安装到你的服务器上。如果没有安装,请阅读上篇:nginx 学习笔记(1) nginx安装。这篇手册主要内容:1. 如何启动和停止nginx,如何加载nginx配置;

2.配置文件的结构;3.如何安装nginx来做静态内容的服务器;4,如何配置nginx作为代理服务器;5:如何连接FastCGI应用。

nginx有一个主进程和多个工作进程。主进程的作用是读和验证配置文件,启动工作进程。工作进程正在处理请求。nginx应用事件驱动模型和os依赖机制来在工作进程之间有效的分发请求(负载均衡)。工作进程的数目定义在配置文件中,在一个特定的配置中一般是固定的或者可以根据可用的cpu 内核来动态修改这个数量。工作进程参考:http://nginx.org/en/docs/ngx_core_module.html#worker_processes

nginx及其模块如何工作取决于配置文件的定义。默认情况下,配置文件为:nginx.confand 目录为/usr/local/nginx/conf/etc/nginx, 或者/usr/local/etc/nginx.

启动、停止、重新加载ngnix配置文件

启动nginx,直接执行可运行文件即可。一旦nginx启动完成,可以通过可运行参数s来控制nginx的运行。

语法如下:

nginx -s signal

signal可选项

  • stop — 快速停止
  • quit — 完整停止
  • reload —重新加载
  • reopen — 重新打开日志文件

例如,停止nginx但等待工作进程处理完成当前的请求,可以使用下面的命令:

nginx -s quit

注意:这个命令的执行者必须是和启动nginx的是同一个用户。

直接修改配置文件将不会立即生效,需要重启nginx或者向nginx发送reload配置文件命令:

nginx -s reload

当主进程收到重新加载配置的信号后,它先检测新配置的语法是否规范,然后开始尝试加载新的配置。如果上面的步骤成功,主进程开始启动新的工作进程并且发停止信号给旧的工作进程;否则,主进程回滚到改变前的配置,并继续使用旧的配置工作。旧的工作进程接受到停止工作信号,它停止接受新的连接请求,但继续处理当前的请求知道这些请求被处理完成。最后,旧的工作进程退出。

nginx进程也可以通过unix工具进行处理,例如kill命令。unix工具可以通过进程ID作为参数来进行处理。默认情况下,nginx主进程的id写入/usr/local/nginx/logs或者/var/run文件中。例如,如果主进程的id是1628,发送quit信号将会使nginx完整退出,命令如下;

kill -s Quit 1628

同样,也可以功过ps命令来获取nginx运行的所有进程列表,例如下面的方法:

ps -ax | grep nginx

想获取更多nginx信号的信息,请参考下一篇:nginx控制。

配置文件的结构

ngnix的配置包含了许多模块,每个模块使用指令来运行。指令包含简单指令和块指令。简单指令通过空格来分离名称和参数,使用分号(;)作为结尾;块指令和简单指令有相同的结构,但不是以分号结尾而是以大括号({})包含指令。如果一个块指令中大括号内含有其它指令,那么括号内的叫做上下文(例如:事件、http、服务器、位置)。

在配置文件中,不在任何上下文的指令被认为存在于主上下文。事件和http指令就存在于主上下文中,server在http上下文中,位置在server上下文中。

配置文件使用#号作为注释符号。

为静态文件提供服务

一个web服务器的重要工作就是为静态文件服务。例如,你想根据请求的不同,去不同目录去请求服务:/data/www存放html文件,/data/images存放图片信息。这就需要修改配置文件,建立一个服务器块,在这个http块中建立服务器块,服务器块内再建立两个不同的位置块。

首先,创建/data/www目录并把一个包含任意内容的index.html文件放入该目录;创建/data/images目录,放置一些图片。

然后,打开配置文件。默认配置文件中已经包含了一些server块的实例,大部分被注释掉了。现在注释掉所有的类似块,新写一个server块:

http {
server {
}
}

通常,配置文件可能会包含几个server块,server通常指定名称和监控端口。当nginx决定哪个server进程处理请求时,它测试uri请求报文头而不是定义在server块中的位置指令的参数。

增加下面的位置块到服务器块中:

location / {
root /data/www;
}

位置包括中定义的“/”前缀和请求uri进行比较。如果和uri中请求匹配,uri将增加root指令的路径到uri中,亦即到本地文件系统的路径/data/www下去响应请求。如果有多个位置块匹配,nginx选择最长后缀的那个。以上的位置块提供了最短的前缀(长度为1),因此当只有所有别的位置块都不能提供匹配时,这个模块才能使用到。

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

location /images/ {
root /data;
}

它将匹配以/images/开头的请求(位置“/”也匹配这些request,但它的前缀更短)。

上述完整的配置如下:

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

上述已经是一个可以运行的服务器的配置了,该服务器监听http标准端口80,可以通过htt://localhost/来访问本地机器。如果请求以/images/开头,那么该服务器将从目录/data/images/下获取文件来应答请求。例如:请求http://localhost/images/example.png发送后,nginx将发送/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来查找原因。

建一个简单的代理服务器

nginx另一个频繁使用的特性是作为一个简单的代理服务器,代理服务器意思就是接受请求,并发送这些请求到被代理的服务器,从代理的服务器得到响应信息,然后发送给客户端。

下面介绍配置一个简单的代理服务器的例子,这个代理服务器提供从本地机器获取图片请求,然后发送到别的其它的被代理服务器。在这个例子中,所有的服务器都定义在一个单独nginx实例。

首先,定义被代理服务器,这可以通过在配置文件中增加一个或者多个服务器块,具体内容如下:

server {
listen 8080;
root /data/up1; location / {
}
}

这个简单的服务器监听端口8080(上个例子中没有使用listen是因为使用http标准端口80),映射所有的请求到本地文件系统的/data/up1目录,创建此目录并放置index.html文件到该目录。注意root指令被放置到服务器上下文。当选择提供服务的位置块不包含自己的root指令时该root指令将被使用。

接下来,使用上篇服务器的配置并修改,使之成为一个代理服务器的配置。在第一个位置块中,在第一行的参数中添加proxy_pass指令加代理服务器的协议、名称、端口。(在我们的例子中是http://localhost:8080):

server {
location / {
proxy_pass http://localhost:8080;
} location /images/ {
root /data;
}
}

我们将修改第二个位置块的配置,以前是映射/image/前缀的请求到/data/images/目录下的文件,为了和典型图片的文件扩展名相匹配,修改的位置块配置文件如下:

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

这个参数是一个正则表达式,它匹配以.gif,.jpg或者.png结尾的url。一个正则表达式应该以~开头。响应的请求将被映射到/data/images目录。

当nginx选择一个位置块为请求提供服务时,它首先检测指定带前缀的位置指令,别忘记优先选择最长前缀的,再检测正则表达式。如果和一个正则表达式匹配,nginx选择这个位置块,否则选择最初的那个。

完整的代理服务器配置如下:

server {
location / {
proxy_pass http://localhost:8080/;
} location ~ \.(gif|jpg|png)$ {
root /data/images;
}
}

这个服务器将过滤以以.gif,.jpg或者.png结尾的请求,然后映射到目录/data/images 下(通过增加url到root指令参数),转发其它请求到配置的被代理服务器中。

更多用来配置代理连接的指令可以参考:http://nginx.org/en/docs/http/ngx_http_proxy_module.html

建立FashCGI代理

nginx可以用来追踪到FastCGI 服务器上的请求,FastCGI服务器可以运行不同框架不同编程语言(例如php)构建的应用程序。

适用FastCGI服务器运行的nginx最基本配置包括:使用fastcgi_pass指令而非proxy_pass;fastcgi_param指令设置发送参数到Fastcgi服务器。假定可以通过http://localhost:9000来访问FastCGI服务器。使用上章的代理服务器配置,替换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;
}
}

这将建立一个服务器,该服务器追踪到被代理的服务器的所有请求(静态图片除外),这个服务器使用FastCGI协议通过localhost:9000来操作。