nginx源码安装默认安装路径为:/usr/local/nginx
把nginx的启动脚本加入到path环境变量:
export PATH=$PATH:/usr/local/nginx/sbinphp
查看一下帮助文档:html
[root@os1 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服务器的中止:linux
在上面的命令帮助里面有一个-s参数,nginx服务中止,能够借助于-s参数,nginx -s stop便可中止nginx服务器。nginx
nginx除了使用安装包里面的nginx基本进行重启以外,还可使用linux系统的信号传输机制。正则表达式
nginx服务器在运行是,会保持一个主进程和一个或多个工做进程,咱们能够经过给nginx服务主进程发送信号就能够控制服务的动做。后端
[root@db1 ~]# 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默认的服务器配置文件都存放在安装目录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块和虚拟主机的概念有密切联系。
虚拟主机,又称为虚拟服务器,主机空间或网页空间,它是一种技术。该技术是为了节省互联网服务器硬件成本而出现的。
user usename [group];
username: 指定能够运行nginx服务器的用户。
group: 可选项,指定能够运行nginx服务器的用户组。
只有被设置的用户或者用户组才有权限启动nginx。
若想全部的用户均可以启动nginx进程,能够把username,group都设置为nobody,或者把这一行注释掉。
worker process是nginx服务器实现并发处理服务的关键所在。
worker process number |auto;
number:指定nginx进程最多能够产生worker process的数量、
auto:设置此值,nginx进程将自动检测。
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块中配置。
在默认的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
用于开启或关闭使用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 ~^www\d+\.myserver\.com$;
因为server_name指令支持使用通配符和正则表达式两种配置名称的方式,所以在包含多个虚拟主机的配置文件中,可能会出现一个名称被多个虚拟主机的server_name匹配。为解决这个问题,nginx作以下规定:
按照如下的优先级选择虚拟主机,排在前面的优先处理请求。
以上四种匹配方式中,若是server_name被处于同一优先级的匹配屡次匹配成功,则首次匹配成功的虚拟主机处理请求。
...... server { listen 80; server_name 192.168.1.120; } ......
可使用这个ip对网站发起请求。
root path;
location / {
root html;
index index.html index.htm;
}
#index默承认以有多个值,默认是使用index.html
error_page code [=[response]] uri;
#code: 要处理http错误代码
#response: 可选项,将code指定的错误代码转化为新的错误代码response。
#uri: 用指定的页面响应错误代码。
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; } 从上到下依次匹配,匹配成功就中止继续匹配。
auth-basic string |off; string: 开启认证功能,并配置验证时的指示信息。 off:关闭认证功能。 auth_basic_user_file指令,用于设置包含用户名和密码信息的文件路径,语法结构为: auth_basic_user_file file;
须要注意的是:
这里建立密码文件须要用到htpasswd命令,htpasswd命令用法!