[TOC]
Nginx服务器的安装部署
Linux版本的编译和安装
准备工作
- 安装gcc
# yum install gcc
- 安装pcre
# yum install pcre-devel
- 安装zlib
# yum install zlib zlib-devel
- 安装openssl
# yum install openssl openssl-devel
- 下载源码包,选择稳定版本,解压缩安装
官网下载地址
# tar -zxvf nginx-xxxx.tar.gz
依赖项综合下载安装命令:
# yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
编译和安装
- 进入解压后的安装目录
# cd nginx-xxx
- 执行configuer脚本
# ./configure
- 指定安装路径,添加参数
--prefix=/usr/nginx
- 如果不指定路径,可以通过
whereis nginx进行查询默认到的位置
configuer脚本参数详解
- 指定安装路径,添加参数
- 编译
# make
- 安装
# make install
Nginx服务的启停控制
Nginx服务的信号控制
获取Nginx服务PID的两种途径:
- 在Nginx服务启动以后,默认在Nginx服务器安装目录下的logs目录中会产生文件名为nginx.pid的文件,此文件中保持的就是Nginx服务主进程的PID
- 使用Linux平台的命令行工具ps查看进程
# ps -ef | grep nginx
Nginx服务可接收的信号:
信号 | 作用 | 可否用于worker进程 |
---|---|---|
TERM或INT | 快速停止Nginx服务 | 是 |
QUIT | 平缓停止Nginx服务 | 是 |
HUP | 使用新的配置文件启动进程,之后平缓停止原有进程,也就是所谓“平滑重启” | 否 |
USER1 | 重新打开日志文件,常用语日志分割 | 是 |
USER2 | 使用新版本的Nginx文件启动服务,之后平缓停止原有Nginx进程,也就是所谓“平滑升级” | 否 |
WINCH | 平缓停止worker process,用于Nginx服务器平滑升级 | 是 |
向Nginx服务主进程发送信号的两种方法:
- 使用kill命令发送信号
kill SIGNAL PID
:SIGNAL用于指定上表中的信号
kill SIGNAL 'filepath'
:从Nginx进程号文件中获取进程号 - 使用Nginx二进制文件,具体参照下一小节
./sbin/Nginx -g SIGNAL
Nginx服务的启动
直接运行# ./sbin/nginx
便可启动Nginx服务,可接收的命令行参数如下:
-
-?,-h
:显示帮助信息 -
-v
:打印版本号并退出 -
-V
:打印版本号和配置并退出 -
-t
:测试配置正确性并退出 -
-q
:测试配置时只显示错误 -
-s signal
:想主程序发送stop,quit,reopen,reload信号 -
-p prefix
:指定Nginx服务器路径前缀,用来改变Nginx的安装路径,常用于平滑升级Nginx服务器的场合 -
-c filename
:指定Nginx配置文件路径 -
-g directives
:指定Nginx附加配置文件路径,向Nginx服务指定启动时应用于全局的配置
Nginx服务的停止
# ./sbin/Nginx -g TERM | INT | QUIT
# kill TERM | INT | QUIT '/Nginx/logs/nginx.pid'
-
# kill -p | SIGKILL '/Nginx/logs/nginx.pid'
,强制关闭不推荐使用
Nginx服务的重启
-
# ./sbin/nginx -s reload
: 强制重启 -
# ./sbin/nginx -g HUB [-c newConfFile]
: 平滑重启 -
# kill HUP '/Nginx/logs/nginx.pid'
: 使用新配置文件替换旧配置文件后的平滑重启
平滑重启的过程:Nginx服务进程接收到信号后,首先读取新的Nginx配置文件,如果配置语法正确,则启动新的Nginx服务,然后平缓关闭旧的服务进程;如果新的Nginx配置有问题,将显示错误,仍然使用旧的Nginx进程提供服务
Nginx服务器的升级
平滑升级的过程:Nginx服务接收到USER2信号后,首先将旧的nginx.pid文件(如果在配置文件中更改过这个文件的名字,也是相同的过程)添加后缀.oldbin,变为nginx.pid.oldbin文件;然后执行新版本Nginx服务器的二进制文件启动服务。如果新的服务启动成功,系统中将有新旧两个Nginx服务共同提供Web服务。之后,需要向旧的Nginx服务进程发送WINCH信号,使旧的Nginx服务平滑停止,并删除nginx.pid.oldbin文件。在发送WINCH信号之前,可以随时停止新的Nginx服务
注意:为了实现Nginx服务器的平滑升级,新的服务器安装路径应该和旧的保持一致。因此建议用户在安装新服务器之前先备份旧服务器。如果由于某种原因无法保持新旧服务器安装路径一致,则可以先使用一下命令将旧服务器的安装路径更改为新服务器的安装路径:
# ./Nginx/nginx -p newInstallPath
使用如下命令平滑升级:
# ./sbin/nginx -g USR2
或使用# kill USR2 '/Nginx/logs/nginx.pid'
通过ps -ef | grep nginx
查看新的Nginx服务启动正常,再使用:
# ./sbin/nginx -g WINCH
或使用# kill WINCH '/Nginx/logs/nginx.pid'
Nginx服务器基础配置指令
Nginx服务器主配置文件为安装目录中conf文件夹下的nginx.conf文件
nginx.conf文件的结构
... # 全局块
events # events块
{
...
}
...
http # http块
{
... # http全局块
server # server块
{
... # server全局块
location [PATTERN] # location块
{
...
}
location [PATTERN] # location块
{
...
}
}
server # server块
{
...
}
... # http全局块
}
nginx.conf由三部分组成:全局块、events块和http块。在http块中,又包含http全局块、多个server块。每个server块中,可以包含server全局块和多个location块。
同一个指令放在不同层级的块中,其作用域也不同,一般情况下,高一级块中的指令作用于自身所在的块和此块包含的所有低层级块。如果某个指令在两个不同层级的块中同时出现,就采用“就近原则”,即以较低层级块中的配置为准。
- 全局块
主要设置一些影响Nginx服务器整体运行的配置指令,因此,这些指令的作用域是Nginx服务器全局。通常包括配置运行Nginx服务器的用户(组)、允许生成的worker process数、Nginx进程PID存放路径、日志的存放路径和类型以及配置文件引入等 - events块
主要设置影响Nginx服务器与用于的网络连接。常用到的设置包括是否开启对多work process下的网络连接进行序列化,是否允许同时接受多个网络连接,选取那种事件驱动模型处理连接请求,每个worl process可以同时支持的最大连接数等 - http块
http块是Nginx服务器配置中的重要部分,代理、缓存和日志定义等绝大多数的功能和第三方模块的配置都可以放在这个模块中。可以在http全局块中配置的指令包括文件引入、MIME-Type定义、日志自定义、是否使用sendfile传输文件、连续超时时间、单连接请求数上限等 - server块
虚拟主机(虚拟服务器):将一台服务器的某项或者全部服务内容逻辑划分为多个服务单位,对外表现为多个服务器,从而充分利用服务器硬件资源。从用户角度看,一台虚拟主机和一台独立的硬件主机是完全一样的。
虚拟主机技术使得Nginx服务器可以在同一台服务器上只运行一组Nginx进程,就可以运行多个网站。
每一个server块就相当于一台虚拟主机,它内部可有多台主机联合提供服务,一起对外提供在逻辑上关系密切的一组服务(网站) - location块
严格意义上讲,location其实是server块的一个指令。主要作用是:基于Nginx服务器接收到的请求字符串(例如,server_name/uri_string),对除虚拟主机名称(也可以是IP别名)之外的字符串(前例中的"uri_string"部分)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能都是在这部分实现。许多第三方模块也是在这里配置
配置运行Nginx服务器用户(组)
语法为:user user [group];
,只能在全局块中配置
- user,指定可以运行Nginx服务器的用户
- group,指定可以运行Nginx服务器的用户组
只有被设置的用户或者用户组成员才有权限启动Nginx进程,其他用户启动将会报错
如果希望所有用户都可以启动Nginx服务器,可将该行注释或使用user nobody nobody
,此为默认配置
配置允许生成的worker process数
worker process是Nginx服务器实现并发处理服务的关键所在,该值越大,可以支持的并发处理量也越多,但实际还受软件自身、操作系统、硬件设备等的制约。语法为:
worker_processes number | auto;
,只能在全局块中配置
- number,指定Nginx进程最多可以产生的worker process数
- auto,Nginx将自动检测生成数量
默认number为1
配置Nginx进程PID存放路径
语法为:pid file
,只能在全局块中配置
默认为Nginx安装目录log下,名字为nginx.pid。
路径可以为相对路径或绝对路径,路径后必须有要保存的文件名,否则会报错
配置错误日志的存放路径
可在全局块、http块和server块中设置,语法为:
error_log file | stderr [debug | info | notice | warn | error | crit | alert | emerg];
Nginx服务器的日志支持输出到某个固定文件file或者标准错误输出stderr;日志的级别为可选项,需要在编译时通过命令行指定级别。设置某一级别后,比这一级别搞的日志也会被记录
配置文件的引入
可以将其他的Nginx配置或者第三方模块的配置引用到当前的主配置文件中,语法为:
include file;
可使用相对路径,并且可以放在配置文件的任意地方
设置网络连接的序列化
惊群问题:当某一时刻只有一个网络连接到来时,多个睡眠进程会被同时叫醒,但只有一个进程可以获得连接。如果每次唤醒的进程数目太多,会影响一部分系统性能。在Nginx服务器的多进程下,有可能出现这样的问题。
Nginx通过配置accept_mutex配置解决该问题,当设置为开启时将会对多个Nginx进程接收连续进行序列化,防止多个进程对连接的争抢。语法为:
accept_mutex on | off;
默认Wie开启,只能在events块中配置
设置是否允许同时接收多个网络连接
每个Nginx服务器的worker process都有能力同时接收多个新到达的网络连接,其配置语法为:
multi_accept on | off;
默认为关闭,即每个worker process一次只能接收一个新到达的网络连接。只能在events块中设置
事件驱动模型的选择
强制Nginx服务器选择某种事件驱动程序模型进行消息处理,语法为:
user method;
method可选择的内容为:select、poll、kqueue、epoll、rtsig、dev/poll以及evetpot
可以在编译时使用命令行强制编译select、poll到内核
该指令只能在events块中使用
配置最大连接数
用来设置运行每一个worker process同时开启的最大连接数。语法为:
worker_connections number;
默认值为512。此number包括所有可能的连接数,并且不能大于操作系统支持打开的最大文件句柄数量。只能在events块中配置。
定义MIME-Type
使用types块定义MIME
types
{
text/html html htm shtml;
image/gif gif;
application/x-javascript js;
...
}
可使用inclue引入外部MIME的types文件定义:
include mime.types;
使用default_type配置处理前端请求的MIME类型:
default_type mime-type;
默认值为text/plain。该指令可以再http全局块、http块、server块和location块中设置
自定义服务日志
记录Nginx服务器提供服务过程应答前端请求的日志称为服务日志
使用access_log path[format [buffer=size];]
指定存放位置、格式字符串名称及文件缓存区大小,例如access_log logs/access.log combined;
,combined为log_format指令默认定义的日志格式字符串名称。
如果使要取消服务日志的功能,使用access_log off;
此指令可以在http块、server块、location块中使用
使用log_format name string ...;
用于定义服务日志的格式,并可以指定一个字符串作为名字(默认为combined)。string为服务日志的格式字符串,可使用Nginx内置变量
实例:
log_format exampleLog '$remote_addr - [$time_local] $request'
'$status $body_bytes_sent $http_referer'
'$http_user_agent';
此指令只能在http块中进行设置
配置允许sendfile方式传输文件
sendfile on | off;
用于开启或者关闭sendfile()传输文件,默认值为off,可在http块、server块、location块中配置
sendfile_max_chunk size;
用于指定Nginx进程的每个worker process每次调用sendfile()传输的数据量最大值不能超过这个值;如果设置为0表示无限制。默认为0。可在http块、server块、location块中配置
配置连续超时时间
与用于建立会话连接后,Nginx服务器可以保持这些连接打开一段时间。语法为:
keepalive_timeout timeout[header_timeout];
- timeout,服务端对连接的保持时间。默认值75s
- header_timeout,可选项,在应答报文头部的Keep-Alive域设置超时时间:"Keep-Alive:timeout=header_timeout"。
此指令可在http块、server块、location块中配置
单连接请求数上限
Nginx服务器和用户端建立会话连接后,用户端通过此连接发送请求。
keepalive_requests number;
用于限制用户通过某一连接向Nginx服务器发送请求的次数,默认值为100。
此指令可以在server块和location块中配置
配置网络监听
配置网络监听使用指令listen
第一种:
listen address[:port] [default_server] [setfib=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [deferred] [accept_filter=filter] [bind] [ssl];
第二种:
listen port [default_server] [setfib=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [deferred] [accept_filter=filter] [bind] [ipv6only=on|off] [ssl];
第三种:
listen unix:path [default_server] [backlog=number] [rcvbuf=size] [sndbuf=size] [deferred] [accept_filter=filter] [bind] [ssl];
具体指令比较复杂,但使用比较简单,默认设置为:
listen *:80 | *:8000;
监听所有80端口和8000端口
基于名称的虚拟主机配置
这里的“主机”就是指此server块对外提供的虚拟主机。设置了主机的名称并配置好DNS,用户就可以使用这个名称向此虚拟主机发送请求了。配置主机名称的指令为server_name,其语法结构为:
server_name name ...
对于name来说,可以只有一个名称,也可以由多个名称并列,之间使用空格隔开。每个名字就是一个域名,由三段或者两段组成,之间由“.”隔开,例如:
server_name myserver.com www.myserver.com;
在name中可以使用通配符“*”,但通配符只能用在由三段字符串组成的名称的首段或者尾段,或者两段字符串组成的名称的尾段,例如:
server_name *.myserver.com www.myserver.*;
在name中还可以使用正则表达式,并使用波浪号“~”作为正则表达式字符串的开始标记,例如:
server_name ~^www\d+\.myserver\.com$;
name中的正则表达式支持字符串捕获功能,即可以将正则表达式匹配成功的名称中的一部分字符串拾取出来,放在固定的变量中供下文使用。拾取的标识为一对完整的小括号“()”且后面不紧跟其他的正则表达式字符,括号中的内容就是被拾取的内容。一个正则表达式中可以存在多对不嵌套的小括号,这些内容会被从左到右放在变量2、$3...中。下文使用时,直接使用这些变量即可。这些变量的有效区域不能超过本server块。实例:
server_name ~^www\.(.+)\.com$;
当请求通过www.myserver.com到达Nginx服务器端时,其中的“myserver”会被捕获记录到变量1代替myserver了
如果出现一个名称被多个虚拟主机匹配成功,其处理规则如下:
- 对于匹配方式不同的,按照以下的优先级选择虚拟主机,排在前面的优先处理请求
a. 精确匹配server_name
b. 通配符在开始时匹配server_name成功
c. 通配符在结尾时匹配server_name成功
d. 正则表达式匹配server_name成功 - 在以上四种匹配方式中,如果server_name被处于同一优先级的匹配方式多次匹配成功,则首次匹配成功的虚拟主机处理请求
基于IP的虚拟主机配置
配置基于IP的虚拟主机,即为Nginx服务器提供的每台虚拟主机配置一个不同的IP,因此需要将网卡设置为同时能够监听多个IP地址。
在Linux使用ifconfig工具为同一块网卡添加多个IP别名:
# ifconfig eth1:0 192.168.1.31 netmask 255.255.255.0 up
# ifconfig eth1:1 192.168.1.32 netmask 255.255.255.0 up
命令中的up表示立即启用此别名
按照如上方法设置的别名在系统重启后不予保存。可以将上面的两条命令添加到Linux的启动脚本rc.local中,这样重启后,依然生效:
# echo "ifconfig eth1:0 192.168.1.31 netmask 255.255.255.0 up" >> /etc/rc.local
# echo "ifconfig eth1:1 192.168.1.32 netmask 255.255.255.0 up" >> /etc/rc.local
配置Nginx服务器基于IP的虚拟主机使用的指令和配置基于名称的虚拟主机的指令是相同的,即server_name,语法结构也相同,而且不考虑通配符和正则表达式的问题
...
http
{
...
server
{
listen: 80;
server_name: 192.168.1.31;
...
}
server
{
listen: 80;
server_name: 192.168.1.32;
...
}
...
}
配置location块
location的语法结构为:
location [ = | ~ | ~* | ^~] uri {...}
url变量是待匹配的请求字符串。可以是不包含正则表达式的字符串,称为标准uri。也可以是包含正则表达式的字符串,称为正则uri。
方括号里的部分是可选项,用来改变请求字符串与uri的匹配方式。
在不添加放方括号中的选项时,Nginx首先在server块的多个location块中搜索是否有标准uri和请求字符串匹配,如果有多个可以匹配,就记录匹配度最高的一个。然后,服务器再用location块中的正则uri和请求字符串匹配,当第一个正则uri匹配成功,结束搜索,并使用这个location块处理请求;如果正则匹配全部失败,就使用刚才记录的匹配度最高的location块处理此请求。
添加方括号中内容的含义:
- “=”,用于标准uri前,要求请求字符串与uri严格匹配。如果已经匹配成功,就停止继续向下搜索并立即处理此请求
- “~”,用于表示uri包含正则表达式,并且区分大小写
- “~*”,用于表示uri包含正则表达使,并且不区分大小写
- “^~”,用于标准uri前,要求Nginx服务器找到表示uri和请求字符串匹配度最高的location后,立即使用此location处理请求,而不再使用location块中的正则uri和请求字符串做匹配
配置请求的根目录
Web服务器收到网络请求以后,首先要在服务器端指定目录中寻找请求资源。在Ngin服务器中,指令root就是用来配置这个根目录的,其语法结构为:
root path;
其中,path为Nginx服务器接收到请求以后查找资源的根目录路径。path变量中可以包含Nginx服务器预设的大多数Nginx内置变量,只有realpath_root不可以使用
此指令可以在http块、server块或者location块中配置。由于使用Nginx服务器多数情况下要配置多个location块对不同的请求分别作出处理,因此该指令通常在location块汇总进行设置
location /data/
{
root /locationtest1;
}
当location块接收到“/data/index.htm”的请求时,将在/locationtest1/data/目录下找到index.htm响应
更改location的URI
可以使用alias指令改变location接收到的URI的请求路径,语法结构为:
alias path;
其中,path为修改后的根路径。同样,此变量可以包含除了realpath_root之外的其他Nginx内置变量
示例:
location ~ ^/data/(.+\.(htm|htm))$
{
alias /locationtest1/other/$1;
}
当此location块接收到“/data/index.htm”的请求时,匹配成功,之后根据alias指令的配置,Nginx服务器将到/lcationtest1/other目录下找到index.htm并响应请求。通过alias指令的配置,根路径已经从/data更改为/locationtest1/other
设置网站的默认首页
指令index用于设置网站的默认首页,它一般可以有两个作用:一是,用户在发出请求访问网站时,请求地址可以不写首页名称;二是,可以对一个请求,根据其请求内容而设置不同的首页。该指令的语法结构为:
index file ...;
其中,file变量可以包括多个文件名,其间使用空格分隔,也可以包含其他变量。此变量默认为“index.html”
示例:
location ~ ^/data/(.+)/web/ $
{
index index.$1.html index.my1.html index.html;
}
当location块接收到“/data/locationtest/web”时,匹配成功,它首先将预置变量$1值为“locationtest”,然后在/data/locationtest/web路径下按照index的配置次序依次寻找index.locationtest.html页、index.my1.html和index.html页,首先找到哪个页面,就使用哪个页面响应请求
设置网站的错误页面
Nginx服务器设置网站错误页面的指令为error_page,语法结构为:
error_page code ... [=[response]] uri
- code,要处理的HTTP错误代码
- response,可选项,将code指定的错误代码转化为新的错误代码response
- uri,错误页面的路径或者网站地址。如果设置为路径,则是以Nginx服务器安装路径下的html目录为根路径的相对路径;如果设置为网址,则Nginx服务器会直接访问该网址获取错误页面,并返回给客户端
如果不想将错误页面放到Nginx服务器的安装路径下管理,值需要另外使用一个location指令定向错误页面到新的路径下面就可以了
error_page 404 /404.html
location /404.html
{
root /myserver/errorpages/
}
error_page指令可以在http块、server块、location块中配置
基于IP配置Nginx的访问权限
Nginx配置通过两种途径支持激吻访问权限的控制,其中一种是由HTTP标准模块ngx_http_access_module支持的,其通过IP来判断客户端是否拥有对Nginx的访问权限。
allow指令,用于设置允许访问Nginx的客户端IP,语法结构为:
allow address | CIDR | all;
- address,允许访问的客户端的IP,不支持同时设置多个。如果有多个ID需要设置,需要重复使用allow指令
- CIDR,允许访问的客户端的CIDR地址,例如202.80.18.23/25,前面是32位IP地址,后面"/25"代表该IP地址中前25位是网络部分,其余位代表主机部分
- all,代表允许所有客户端访问
另外一个指令是deny,作用刚好和allow指令相反,它用于设置禁止访问Nginx的客户端IP,语法结构是:
deny address | CIDR | all;
这连个指令都可以在http块、server块、location块中配置。
Nginx配置在解析的过程中,遇到deny指令或者allow指令是按照顺序对当前客户端的连接进行访问权限检查的。如果遇到匹配的配置时,则停止继续向下搜索相关配置。
基于密码配置Nginx的访问权限
Nginx只是基于HTTP Basic Authentication协议的认证。该协议是一种HTTP性质的认证方法,需要识别用户名和密码,认证失败的客户端不拥有访问Nginx服务器的权限。该功能由HTTP标准模块ngx_http_auth_basic_module支持。
auth_basic指令,用于开启或者关闭该认证功能,语法结构为:
auth_basic string | off
- string,开启该认证功能,并配置验证时的指示信息
- off,关闭该认证功能
auth_basic_user_file指令,用于设置包含用户名和密码信息的文件路径,语法结构为:
auth_basic_user_file file
,其中file为密码文件的绝对路径
网友评论