nginx详解

Posted wxzhe

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx详解相关的知识,希望对你有一定的参考价值。

nginx的启动和简易部署

nginx服务器的启动:  

nginx源码安装默认安装路径为:/usr/local/nginx
把nginx的启动脚本加入到path环境变量:
  export PATH=$PATH:/usr/local/nginx/sbin

查看一下帮助文档:

[[email protected] sbin]# nginx -h
nginx version: nginx/1.2.9
Usage: nginx [-?hvVtq] [-s signal] [-c filename] [-p prefix] [-g directives]

Options:
  -?,-h         : this help
  -v            : show version and exit  #显示版本号
  -V            : show version and configure options then exit # 显示版本号及可选参数退出
  -t            : test configuration and exit                  # 测试配置文件,并退出
  -q            : suppress non-error messages during configuration testing # 测试配置文件时,只显示错误
  -s signal     : send signal to a master process: stop, quit, reopen, reload # 接收后面的信号
  -p prefix     : set prefix path (default: /usr/local/nginx/)   # 指定nginx的安装路径
  -c filename   : set configuration file (default: conf/nginx.conf)  # 设定nginx的配置文件
  -g directives : set global directives out of configuration file # 指定nginx的附加配置文件

启动的时候直接使用nginx命令即可。

nginx服务器的停止:

在上面的命令帮助里面有一个-s参数,nginx服务停止,可以借助于-s参数,nginx -s stop即可停止nginx服务器。

nginx服务器的信号控制

nginx除了使用安装包里面的nginx基本进行重启之外,还可以使用linux系统的信号传输机制。

nginx服务器在运行是,会保持一个主进程和一个或多个工作进程,我们可以通过给nginx服务主进程发送信号就可以控制服务的动作。

[[email protected] ~]# ps aux |grep nginx
root     25281  0.0  0.1  96492  2116 ?        Ss   Jul06   0:00 nginx: master process nginx
nginx    25282  0.0  0.1  96884  3084 ?        S    Jul06   0:01 nginx: worker process
root     25313  0.0  0.0 103244   840 pts/1    S+   08:34   0:00 grep nginx

#这里面是一个主进程和一个worker进程

nginx服务主进程能够接收的信号如下:

  作用
TERM或INT 快速停止nginx服务
QUIT 平缓停止nginx服务
HUP 使用新的配置文件启动进程,之后平缓停止原有进程,也就是所谓的“平滑重启”
USR1 重新打开日志文件
USR2 使用新版本的nginx文件启动服务,之后平缓停止原有nginx进程,也就是”平滑升级”
WINCH 平缓停止worker process,用于nginx服务器平滑升级。

然后使用kill向nginx主进程发送信号:

kill  SIGNAL  PID #向主进程发送信号

nginx服务重启

更改nginx服务器的配置和加入新模块后,如果希望当前的nginx服务应用新的配置或使新模块生效,就需要重启nginx服务。关闭nginx服务,然后使用新的配置文件重启。

平滑重启:平滑重启是这样一个过程,nginx服务接收到信号后,首先读取新的nginx配置文件,如果配置语法正确,则启动新的nginx服务,然后平缓关闭旧的nginx服务进程;如果新的nginx服务配置有问题,将显示错误,仍然使用旧的nginx进程提供服务。

平滑重启命令如下:

./nginx -g HUP  [-c  newConfigFile]  
#HUP信号用于发送平滑重启信号
#newConfigFile  用于指定新的配置文件

nginx服务器基础配置指令

nginx默认的服务器配置文件都存放在安装目录conf中,主配置文件名nginx.conf.。首先查看一下nginx的配置文件。

user              nginx;                      #在全局中生效
worker_processes  1;

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;


events {                                       #在events块中生效
    worker_connections  1024;
}


http {                                         #在http模块中生效
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  $remote_addr - $remote_user [$time_local] "$request" 
                      $status $body_bytes_sent "$http_referer" 
                      "$http_user_agent" "$http_x_forwarded_for";

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    keepalive_timeout  65;
    include /etc/nginx/conf.d/*.conf;         #在导入conf.d目录下面的配置文件,server虚拟目录块在里面配置

}

全局块

  全局块是默认配置文件从开始到events块之间的一部分内容,主要设置一些影响nginx服务器整体运行的配置指令,因此,这些指令的作用域是nginx服务器全局。

  通常包含配置nginx服务器的用户组,允许生成的worker process数,nginx进程PID存放路径,日志的存放路径和类型以及配置文件的引入。

events块

  events块涉及的指令主要影响nginx服务器与用户的网络连接。常用到的设置包含是否开启对多进程worker process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取那种事件驱动模型处理连接请求,每个worker process可以同时支持的最大连接数等。

  这一部分指令对nginx服务器的性能影响比较大。

http块

  http块是nginx服务器配置中的重要部分,代理,缓存和日自定义等绝大多数的功能和第三方的配置都可以放在这个模块中。

  http块中可以包含自己的全局块,也可以包含server块,server块中又可以进一步包含location块。

server块

  server块和虚拟主机的概念有密切联系。

  虚拟主机,又称为虚拟服务器,主机空间或网页空间,它是一种技术。该技术是为了节省互联网服务器硬件成本而出现的。

配置服务器运行的nginx服务器用户名,用户组

user usename  [group];
username:  指定可以运行nginx服务器的用户。
group:    可选项,指定可以运行nginx服务器的用户组。

只有被设置的用户或者用户组才有权限启动nginx。

若想所有的用户都可以启动nginx进程,可以把username,group都设置为nobody,或者把这一行注释掉。

配置允许生成的worker process数量

worker process是nginx服务器实现并发处理服务的关键所在。

worker process  number |auto;
number:指定nginx进程最多可以产生worker process的数量、
auto:设置此值,nginx进程将自动检测。

配置系统的pid路径

pid   file;

#默认是在nginx安装目录logs下面,名字为nginx.pid,可以使用绝对路径或相对路径

配置错误日志的存放路径

在全局块,http块和server块中都可以对nginx服务器的日志进行相关配置。

error_log  file [debug|into|notice|warn|error|crit|alert|emerg]

后面的日志的级别,从低到高可以选择、

配置文件的引入

include file;

file为要引入的配置文件。

新引用的文件同样要求运行nginx进程的用户对其具有写权限,并且符合nginx配置文件规定的相关语法和结构。

设置网络连接的序列化

当某一个时刻只有一个网络连接到来时,多个睡眠进程会被同时叫醒,但是只有一个进程可获得连接。如果每次唤醒的进程数目太多,会影响一部分系统性能。在nginx服务器的多进程下,就由可能出现这样的问题。

为了解决这样的问题,nginx配置中包含了这样一条指令accept_mutex,当其设置为开启的时候,将会对多个nginx进程接收连接进行序列化,防止多个进程对连接的争抢。其语法结构为:

multi_accpet   on |off;

此指令默认为off状态,即每个worker process一次只能接收一个新到达的网络连接。此指令只能在events块中进行设置。

事件驱动模型的选择

不同的事件驱动模型对nginx的性能影响蛮大的,此指令来强制nginx服务器选择某种事件驱动模型进行消息处理。

use method;
#其中,method可选择的有:select, poll, kqueue, epoll, rtsig, /dev/poll以及eventport

注意:

  可以再编译时使用--with-select_module, 和--without-select_moudle设置是否强制编译select模块到nginx内核。

配置最大连接数:

worker_connections number;
#主要用来设置允许每一个worker process同时开启的最大连接数。

注意:

  这里的number不仅仅包含和前端用户建立的连接数,而是包括所有可能的连接数。另外number值不能大于操作系统支持打开的最大文件句柄数量。次指令只能在events块中配置。

定义MIME-Type

在默认的nginx配置文件中,在http块中有如下设置:

    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

第一行引用了mime_types文件。

第二行中使用指令default_type配置了用于处理前端请求的MIME类型。

自定义服务日志

nginx服务器支持对服务日志的格式,大小,输出等进行配置,需要使用两个指令,分别是access_log和log_format指令。

access_log指令的语法结构为:

access_log path [format [buffer=zise]];
paht:配置服务日志的文件存放路径和名称。
format:可选项,自定义服务日志的格式字符串。
size:配置临时存放日志的内存缓存大小。

log_format name  string;
name:  格式字符串的名字,默认为combined。名字被access_log引用。
string:服务日志的格式字符串:

一个实例如下:
    log_format  main  $remote_addr - $remote_user [$time_local] "$request" 
                      $status $body_bytes_sent "$http_referer" 
                      "$http_user_agent" "$http_x_forwarded_for";

    access_log  logs/access.log  main;

log_format中的可用变量,原链接nginx的内置变量

技术分享图片
$args                    #请求中的参数值
$query_string            #同 $args
$arg_NAME                #GET请求中NAME的值
$is_args                 #如果请求中有参数,值为"?",否则为空字符串
$uri                     #请求中的当前URI(不带请求参数,参数位于$args),可以不同于浏览器传递的$request_uri的值,它可以通过内部重定向,或者使用index指令进行修改,$uri不包含主机名,如"/foo/bar.html"。
$document_uri            #同 $uri
$document_root           #当前请求的文档根目录或别名
$host                    #优先级:HTTP请求行的主机名>"HOST"请求头字段>符合请求的服务器名.请求中的主机头字段,如果请求中的主机头不可用,则为服务器处理请求的服务器名称
$hostname                #主机名
$https                   #如果开启了SSL安全模式,值为"on",否则为空字符串。
$binary_remote_addr      #客户端地址的二进制形式,固定长度为4个字节
$body_bytes_sent         #传输给客户端的字节数,响应头不计算在内;这个变量和Apache的mod_log_config模块中的"%B"参数保持兼容
$bytes_sent              #传输给客户端的字节数
$connection              #TCP连接的序列号
$connection_requests     #TCP连接当前的请求数量
$content_length          #"Content-Length" 请求头字段
$content_type            #"Content-Type" 请求头字段
$cookie_name             #cookie名称
$limit_rate              #用于设置响应的速度限制
$msec                    #当前的Unix时间戳
$nginx_version           #nginx版本
$pid                     #工作进程的PID
$pipe                    #如果请求来自管道通信,值为"p",否则为"."
$proxy_protocol_addr     #获取代理访问服务器的客户端地址,如果是直接访问,该值为空字符串
$realpath_root           #当前请求的文档根目录或别名的真实路径,会将所有符号连接转换为真实路径
$remote_addr             #客户端地址
$remote_port             #客户端端口
$remote_user             #用于HTTP基础认证服务的用户名
$request                 #代表客户端的请求地址
$request_body            #客户端的请求主体:此变量可在location中使用,将请求主体通过proxy_pass,fastcgi_pass,uwsgi_pass和scgi_pass传递给下一级的代理服务器
$request_body_file       #将客户端请求主体保存在临时文件中。文件处理结束后,此文件需删除。如果需要之一开启此功能,需要设置client_body_in_file_only。如果将次文件传 递给后端的代理服务器,需要禁用request body,即设置proxy_pass_request_body off,fastcgi_pass_request_body off,uwsgi_pass_request_body off,or scgi_pass_request_body off
$request_completion      #如果请求成功,值为"OK",如果请求未完成或者请求不是一个范围请求的最后一部分,则为空
$request_filename        #当前连接请求的文件路径,由root或alias指令与URI请求生成
$request_length          #请求的长度 (包括请求的地址,http请求头和请求主体)
$request_method          #HTTP请求方法,通常为"GET""POST"
$request_time            #处理客户端请求使用的时间,单位为秒,精度毫秒; 从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。
$request_uri             #这个变量等于包含一些客户端请求参数的原始URI,它无法修改,请查看$uri更改或重写URI,不包含主机名,例如:"/cnphp/test.php?arg=freemouse"
$scheme                  #请求使用的Web协议,"http""https"
$server_addr             #服务器端地址,需要注意的是:为了避免访问linux系统内核,应将ip地址提前设置在配置文件中
$server_name             #服务器名
$server_port             #服务器端口
$server_protocol         #服务器的HTTP版本,通常为 "HTTP/1.0""HTTP/1.1"
$status                  #HTTP响应代码
$time_iso8601            #服务器时间的ISO 8610格式
$time_local              #服务器时间(LOG Format 格式)
$cookie_NAME             #客户端请求Header头中的cookie变量,前缀"$cookie_"加上cookie名称的变量,该变量的值即为cookie名称的值
$http_NAME               #匹配任意请求头字段;变量名中的后半部分NAME可以替换成任意请求头字段,如在配置文件中需要获取http请求头:"Accept-Language",$http_accept_language即可
$http_cookie
$http_host               #请求地址,即浏览器中你输入的地址(IP或域名)
$http_referer            #url跳转来源,用来记录从那个页面链接访问过来的
$http_user_agent         #用户终端浏览器等信息
$http_x_forwarded_for
$sent_http_NAME          #可以设置任意http响应头字段;变量名中的后半部分NAME可以替换成任意响应头字段,如需要设置响应头Content-length,$sent_http_content_length即可
$sent_http_cache_control
$sent_http_connection
$sent_http_content_type
$sent_http_keep_alive
$sent_http_last_modified
$sent_http_location
$sent_http_transfer_encoding
log_format中可引用的日志变量

配置允许sendfile方式传输文件

用于开启或关闭使用sendfile传输文件,默认值为off,可以在http块,server块或者location块中进行设置。

sendfile  on | off;   # 默认为off,
sendfile_max_chunk  size;
# size值如果大于0,nginx进程的每个worker process每次调用sendfile()传输的数据量最大不能超过这个值;
# 如果设置为0,则无限制。默认值为0.

配置连接超时时间

与用户建立会话连接后,nginx服务器可以保持这些连接打开一段时间,指令keepalive_timeout就是用来设置此时间的,其语法结构为:

keepalive_timeout timeout [header_timeout];
#timeout:服务器对链接的保持事件,默认值为75s。
#可选项,在应答报文头部的keep-alive域设置超时时间:“Keep-Alive: timeout=header_timeout”.

单连接请求数上限

nginx服务器和用户端建立会话连接后,用户端通过此连接发送请求。指令keepalive_requests用于限制用户通过某一连接向nginx服务器发送请求的次数。

keepalice_requests  number;

配置网络监听

listen address[:port] [default_server] [setfib=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [deferred]  [ssl];
address: ip地址,如果是IPv6,需要使用中括号"[]"括起来。
port:端口号,默认使用80端口。
path:socket文件路径
default_server:标识符,将此虚拟设置为address:port的默认主机。
setfib:nginx-0.8.44中使用这个变量为监听socket关联路由表,目前只对FreeBSD系统有用。
backlog=number:设置监听函数,最多允许多少网络连接同时处于挂起状态。FreeBSD默认为-1,其他平台默认为511.
rcvbuf=size, 设置监听socket接收缓存区大小。
sndbuf=size, 设置监听socket发送缓存区大小。
deferred, 标识符,将accept()设置为Deferred模式。
ssl: 使用ssl模式链接。

----------------------
listen命令使用起来比较简单,
listen  *:80; 监听所有ip连接的80端口
listen    80; 监听所有ip连接的80端口
listen  192.168.1.120:80;  监听具体ip和具体端口上的连接。
listen  192.168.1.120  default_server backlog=1024; 
                #设置192.168.1.120的连接请求默认由次虚拟主机处理,并且允许最多1024网络连接同时处于挂起状态。

基于名称的虚拟主机配置

客户可以使用这个名称向此虚拟主机发送请求,配置主机名称指令为server_name,

server_name  name ...;
#name可以是一个名称,也可以由多个名称并列,
server_name  myserver.com   www.test.com;

在name中可以使用通配符“*”,但是通配符只能用在三段域名的段首和段尾,和两端域名的段尾。

server_name  *.myserver.com   www.test.* ;

在那么中可以使用正则表达式,使用"~"作为正则表达式字符串的开始标记。

server_name  ~^wwwd+.myserver.com$;

由于server_name指令支持使用通配符和正则表达式两种配置名称的方式,因此在包含多个虚拟主机的配置文件中,可能会出现一个名称被多个虚拟主机的server_name匹配。为解决这个问题,nginx做如下规定:
按照以下的优先级选择虚拟主机,排在前面的优先处理请求。

  • 精确匹配server_name
  • 通配符在开始时匹配server_name成功
  • 通配符在结尾时匹配server_name成功
  • 正则表达式匹配server_name成功

以上四种匹配方式中,如果server_name被处于同一优先级的匹配多次匹配成功,则首次匹配成功的虚拟主机处理请求。

基于ip的虚拟主机配置

......
server 
{
       listen 80;
       server_name  192.168.1.120;       
}
......

可以使用这个ip对网站发起请求。

配置请求的根目录:

root  path;

设置网站的默认首页

location / {
            root   html;
            index  index.html index.htm;
        }

#index默认可以有多个值,默认是使用index.html

配置nginx的错误页面响应

error_page code   [=[response]]  uri;
#code: 要处理http错误代码
#response: 可选项,将code指定的错误代码转化为新的错误代码response。
#uri: 用指定的页面响应错误代码。

基于ip配置nginx的访问权限:

nginx配置通过两种途径支持基本访问权限的控制,其中一种是有http标准模块ngx_http_access_module支持的,其通过ip来判断客户端是否拥有对nginx的访问权限。

allow指令,用于设置允许访问nginx的客户端ip

allow  address |CIDR |all;
address: 允许访问的客户端ip,不支持同时设置多个。如果有多个ip需要设置,需要重复使用allow指令。
CIDR:  允许访问的客户端cIDR地址。
all: 表示允许所有的客户端访问。

###deny指令与allow相反,则为禁止访问。

location / {
    deny 192.168.1.1;
    allow 192.168.1.120;
    deny all;
}
从上到下依次匹配,匹配成功就停止继续匹配。

基于密码重置nginx的访问权限:

auth-basic  string |off;
string: 开启认证功能,并配置验证时的指示信息。
off:关闭认证功能。

auth_basic_user_file指令,用于设置包含用户名和密码信息的文件路径,语法结构为:
auth_basic_user_file  file;

需要注意的是:

    这里创建密码文件需要用到htpasswd命令,htpasswd命令用法!

 













以上是关于nginx详解的主要内容,如果未能解决你的问题,请参考以下文章

详解Android WebView加载html片段

14.VisualVM使用详解15.VisualVM堆查看器使用的内存不足19.class文件--文件结构--魔数20.文件结构--常量池21.文件结构访问标志(2个字节)22.类加载机制概(代码片段

Python中verbaim标签使用详解

nginx.conf 忽略了 nginx-ingress 配置映射片段

将 nginx rtmp 片段发送到 WebRTC

Linux下nginx编译安装教程和编译参数详解