nginx 基本入门教程
这篇教程简单介绍了nginx并且讲解了一些nginx可以解决的简单任务。这里,我们假设nginx已经安装在读者的机器上。如果没有,可以看一下如何安装nginx。这篇教程主要讲解的是如何启用和停止nginx,和重新加载配置,描述配置文件的基本结构和怎样搭建一个nginx静态辅助器,怎样配置nginx作为一个代理服务器来。
nginx有一个主进程和其他子进程。主进程的主要工作是加载和执行配置文件,并且驻留子进程。子进程用来作为实际的请求处理。nginx采取基于事件的模型和OS依赖的机制,在多个子进程之间高效的分配请求。子进程的个数会直接写在配置文件中并且,对于给定的配置可以是固定的,或者根据可用的CPU核数自动的进行调整(参考子进程)。
nginx和它模块的工作方式是在配置文件中写好的。默认情况下,这个配置文件通常命名为nginx.conf并且会放置在/usr/local/nginx/conf,/etc/nginx,或者/usr/local/etc/nginx。
启用,停止和重载配置
运行可执行文件就可以开启nginx,比如:
//-c为nginx的配置文件 nginx-c/usr/local/nginx/conf/nginx.conf
如果,nginx已经开启,那么它就可以通过使用-s参数的可执行命令控制。使用下列格式:
nginx-ssignal
signal可以为下列命令之一:
- stop—直接关闭nginx
- quit—会在处理完当前正在的请求后退出,也叫优雅关闭
- reload—重新加载配置文件,相当于重启
- reopen—重新打开日志文件
比如,等待当前子进程处理完正在执行的请求后,结束nginx进程,可以使用下列命令:
nginx-squit
执行该命令的用户需要和启动的nginx的用户一致。
如果重载配置文件的命令没有传递给nginx或者nginx没有重启,那么配置文件的改动是不会被使用的。重载配置文件的命令可以使用:
nginx-sreload
一旦主进程接收到重载配置文件的命令后,它会先检查配置文件语法的合法性,如果没有错误,则会重新加载配置文件。如果成功,则主进程会重新创建一个子进程并且发送关闭请求给以前的子进程。如果没有成功,主进程会回滚改动并且继续使用以前的配置。老的子进程在接受关闭的命令后,会停止接受新的请求并且继续处理当前的请求,直到处理完毕。之后,该子进程就直接退出了。
在Unix工具的帮助下,比如使用kill工具,该信号会被发送给nginx进程。在这种情况下,信号会被直接发送给带有进程ID的进程。nginx的主进程的进程ID是写死在nginx.pid文件中的。该文件通常放在/usr/local/nginx/logs或者/var/run目录下。比如,如果主进程的ID是1628,为了发送QUIT信号来使nginx优雅退出,可以执行:
kill-sQUIT1628
为了得到所有正在运行的nginx进程,我们可能会使用到ps工具,比如,像下列的方式:
$ps-ax|grepnginx //结果为:(下面是单核CPU的情况) 516pts/0D+0:00grep--color=autonginx 1156?S1:22nginx:workerprocess 27999?Ss0:00nginx:masterprocess./nginx
更多关于发送信号给nginx,可以参考nginx控制。
配置文件结构
nginx是由一些模块组成,我们一般在配置文件中使用一些具体的指令来控制它们。指令被分为简单指令和块级命令。一个简单的指令是由名字和参数组成,中间用空格分开,并以分号结尾。例如:
//简单指令 root/data/www;
块级指令和简单指令一样有着类似的结构,但是末尾不是分号而是用{和}大括号包裹的额外指令集。如果一个块级指令的大括号里有其他指令,则它被叫做一个上下文(比如:events,http,server,和location)。
在配置文件中,没有放在任何上下文中的指令都是处在主上下文中。events和http的指令是放在主上下文中,server放在http中,location放在server中。
以#开头的行,会被当做注释。
#thisisacomment events{ worker_connections4096;##Default:1024 } http{ server{ listen80; server_namedomain1.comwww.domain1.com; access_loglogs/domain1.access.logmain; roothtml; location~\.php${ fastcgi_pass127.0.0.1:1025; } } }
静态服务器
一个重要的网络服务器的任务是处理文件(比如图片或者静态HTML文件)。这里,你会实践一个例子,文件会从不同的目录中映射(取决于请求):/data/www(放置HTML文件)和/data/images(放置图片)。这需要配置一下文件,将带有两个location的指令的server的块级命令放在server指令中。
首先,创建一个/data/www目录,然后放置一个事先写好内容的index.html文件。接着,创建一个/data/images目录,然后放置一些图片。
下一步,打开配置文件。默认的配置文件已经包含了一些关于server指令的样式,大多数情况下直接把他们给注释掉。现在,注释掉其他的区块,然后写一个新的server区块:
http{ server{ } }
通常,该配置文件可能会包含多个server指令。这些server指令监听不同的端口和服务器名。一旦nginx决定哪个服务进程处理请求,它会根据在server块级指令中定义好的location指令的参数,来匹配请求头中指定的URI。
将下列location指令添加到server指令中:
location/{ root/data/www; }
该location指令相对于请求中的URI执行了“/”的前缀。为了匹配请求,URI会被添加到root命令指定的路径后,即/data/www,得到本地文件系统中请求文件的路径。如果,有几个location匹配到,那么nginx会选择最长的前缀。上面的location提供了长度为1的前缀,所以,仅当其他的location匹配失败后,该指令才会使用。
接着,添加第二个location区块:
location/images/{ root/data; }
它会匹配到以/images/开头的请求(location/也会匹配到该请求,只是前缀更短)
server块级命令的配置结果如下:
server{ location/{ root/data/www; } location/images/{ root/data; } }
这已经是一个可用的服务器配置,它监听标准的80端口并且可以在本地上通过http://localhost/访问。对于URI以/images/开头的请求,服务器会从/data/images目录中,返回对应的文件。例如,nginx会返回/data/images/example.png文件,当接收到http://localhost/images/example.png的请求响应时。如果该文件不存在,nginx会返回一个404错误的响应。没有以/images/开头的URI的请求,将会直接映射到/data/www目录中。比如,响应http://localhost/some/example.html的请求,nginx会发送/data/www/some/example.html文件。
为了使用新的配置文件,如果还没开启nginx需要先开启,然后将重载信号发送给nginx的主进程,通过执行:
nginx-sreload
如果你发现有些地方出了问题,你可以在/usr/local/nginx/logs或者/var/log/nginx目录下的access.log和error.log文件中,找到原因。
搭建一个简易的代理服务
nginx常常用来作为代理服务器,这代表着服务器接收请求,然后将它们传递给被代理服务器,得到请求的响应,再将它们发送给客户端。
我们将配置一个基本的代理服务器,它会处理本地图片文件的请求并返回其他的请求给被代理的服务器。在这个例子中,两个服务器都会定义在一个nginx实例中。
首先,通过在nginx配置文件中添加另一个server区块,来定义一个被代理的服务器,像下面的配置:
server{ listen8080; root/data/up1; location/{ } }
上面就是一个简单的服务器,它监听在8080端口(之前,listen并没被定义,是因为默认监听的80端口)并且会映射所有的请求给本地文件目录/data/up1。创建该目录,然后添加index.html文件。注意,root指令是放在server上下文中。当响应请求的location区块中,没有自己的root指令,上述的root指令才会被使用。
接着,使用前面章节中的server配置,然后将它改为一个代理服务配置。在第一个location区块中,放置已经添加被代理服务器的协议,名字和端口等参数的proxy_pass指令(在这里,就是http://localhost:8080):
server{ location/{ proxy_passhttp://localhost:8080; } location/images/{ root/data; } }
我们将修改第二个location区块,使他返回一些典型后缀的图片文件请求,现在它只会映射带有/images/前缀的请求到/data/images目录下。修改后的location指令如下:
location~\.(gif|jpg|png)${ root/data/images; }
该参数是一个正则表达式,它会匹配所有以.gif,.jpg或者.png结尾的URIs。一个正则表达式需要以~开头。匹配到的请求会被映射到/data/images目录下。
当nginx在选择location去响应一个请求时,它会先检测带有前缀的location指令,记住先是检测带有最长前缀的location,然后检测正则表达式。如果有一个正则的匹配的规则,nginx会选择该location,否则,会选择之前缓存的规则。
最终,一个代理服务器的配置结果如下:
server{ location/{ proxy_passhttp://localhost:8080/; } location~\.(gif|jpg|png)${ root/data/images; } }
该服务器会选择以.gif,.jpg,或者.png结束的请求并且映射到/data/images目录(通过添加URI给root指令的参数),接着将其他所有的请求映射到上述被代理的服务器。
为了使用新的配置,像前几个章节描述的一样,需要向nginx发送重载信号。
这还有很多其他的指令,可以用于进一步配置代理连接。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。