码迷,mamicode.com
首页 > 其他好文 > 详细

nginx学习笔记

时间:2015-12-22 19:38:30      阅读:317      评论:0      收藏:0      [点我收藏+]

标签:nginx   学习   整理   

Nginx学习笔记

一.   安装nginx

Nginx官方网站是http://sysoev.ru/nginx/英文主页http://nginx.net在这里可以获得nginx的最新版本。Nginx有三个版本:稳定版,开发板,历史稳定版。

     1.下载nginx    http://nginx.org/en/download.html

技术分享

安装nginx之前确保系统已经安装了gcc,openssl-devel,pcre-devel,zlib-devel软件库。这几个库一般安装系统时只要选择了开发环境一般都已经安装好了,如果没有安装使用yum安装即可。

2.开始安装nginx

经过编译安装的nginx包含了大部分可用模块,可通过“./configure  --help”选项设置各个模块的使用情况,例如对不需要的http_ssi模块可以通过--without-http_ssi_module”方式关闭。如果需要“http_perl”模块,可以通过“--with-http_perl_module”方式进行安装。

[root@open 下载]#tar -zxvf nginx-1.8.0.tar.gz -C /usr/src/

[root@open 下载]#cd  /usr/src/nginx-1.8.0/

[root@open nginx-1.8.0]#./configure   \

>--with-http_stub_status_module 

>--with-http_gzip_static_module

>--prefix=/usr/local/nginx

[root@open nginx-1.8.0]#make

[root@open nginx-1.8.0]#make install

上面configure选项中“--with-http_stub_status_module”可以用来启用nginxnginxstatus功能,监控nginx的当前状态。

                   Nginx安装完成

二.   Nginx 配置文档

Nginx的配置文件是一个纯文本文件,它一般位于nginx安装目录的conf目录下,这个配置文件是以block的形式组织的。每个block一般以一个大括号“{}”来表示,block可以分为几个层次,整个配置文件中main指令位于最高层,在main层下面可以有eventsHTTP等层级,而在HTTP层中又包含有server层,即server blockserver block中又可分为location层,并且一个server block中可以包含多个location block

下图大概说明了这个层次关系:

 

技术分享

1.     配置与调试nginx

Nginx安装后,会产生相应的安装目录,根据前面的安装路径,nginx的配置文件路径为/usr/local/nginx/conf其中的nginx.conf这个配置文件为nginx的主配置文件。

Nginx配置文件分为四部分:

  • Main(全局设置)

  • Server(主机设置)

  • Upstream(负载均衡服务器设置)

  • LocationURL匹配特定位置的设置)

Main部分设置的指令将影响其它所有设置。

Server部分的指令主要用于指定主机和端口。

Upstream指令主要用于负载均衡,设置一系列的后端服务器。

Location部分用于匹配网页位置。

这四者关系:server继承mainlocation继承serverUpstream既不会继承其他设置也不会被继承。

1)        nginx的全局配置

下面这段内容是nginx的全局配置属性:

#user  nobody;        //nginx worker进程运行用户

worker_processes 1;    //nginx开启的进程数

#error_log logs/error.log;   //主模块指令,定义全局错误日志文件

#error_log logs/error.log  notice;

#error_log logs/error.log  info;

#pid   logs/nginx.pid;  //指定进程id的存储文件位置

worker_rlimit_nofile 65535; 

events {

    use  epoll; //指定nginx工作模式

    worker_connections  1024; //每个进程最大连接数

}

User主模块指令:指定nginxworker进程运行用户以及用户组,默认由nobody账号运行。

Worker_processes:指定nginx要开启的进程数。每个nginx进程平均耗费10MB-12MB根据经验,一般指定一个进程足够了,如果多核CPU建议指定和CPU的数量一样多的进程即可。

Error_log:用来定义全局错误日志文件,日志输出级别有debug(输出最详细)info(仅次于debug),notice(注意,提示服务器某些应用可能要出问题),warn(警告,需要引起管理员注意),error(错误,服务器某些应用已经出现错误,不能正常工作),crit(估计服务器已经宕机了)

Pid用来指定进程和id的存储文件位置

Worker_rlimit_nofile:用于绑定worker进程和CPUlinux内核2.4以上可用。

Events设定nginx的工作模式及连接数上限。

Use用来指定nginx的工作模式。Nginx支持的工作模式有selectpoll,kqueue,epoll,rtsig/dev/poll其中selectpoll都是标准的工作模式,kqueueepoll是高效的工作模式,不同的是epoll用在linux平台,而kqueue用在BSD系统中。对于linux系统,epoll工作模式是首选。

Worker_connections:定义nginx每个进程的最大连接数默认是1024,最大客户端连接数由worker_processesworker_connections决定。即:max_client=worker_processes*worker_connections。作为反向代理时为:max_client=worker_processes*worker_connections/4

进程的最大连接数受linux系统进程的最大打开文件数限制,在执行操作系统命令“ulimit  -n 65536”worker_connections的设置才能生效。

2)        HTTP服务器配置

http {

    include       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  logs/access.log  main;

   sendfile        on;  //开启高效文件传输模式

   tcp_nopush     on;  //防止网络阻塞

    #keepalive_timeout  0; 

   keepalive_timeout  65;  //超时时间,默认为秒

gzip  on;  //开启zip压缩输出

client_max_body_size  20m; //客户端请求最大大哥文件字节数

client_header_buffer_size  32k;//客户端请求头headerbuffer大小

large_client_header_buffers  432k;

client_header_timeout  10;

client_body_timout  10;

send_timeout  10;

include主模块指令:实现对配置文件所包含的设定,可以减少主配置文件的复杂度,类似于apacheinclude用法

default_type:属于HTTP核心模块指令,这里设定默认类型为二进制流,也就是当文件类型未定义时使用这种方式,例如在没有配置PHP环境时,nginx是不予解析的此时,用浏览器访问PHP文件就会出现下载窗口。

Log_format:用于指定nginx日志的输出格式。mylog为此日志输出格式的名称.例如:

Log_format mylog ‘$server_name  $remote_addr -  $remote_user

  [$time_local] “$request”’

  ‘$status $uptream_status  $body_bytes_sent

“http_referer”’

‘”$http_user_agent”  “$http_x_forwarded_for”’

‘$ssl_protocol  $ssl_cipher $upstream_addr

$request_time  $upstream_response_time’;

可以在下面的access_log指令中引用。

Access_log logs/nginx_access.log  mylog;

$server_name:虚拟主机名称

$remote_addr:远程客户端的IP地址

-:空白,用一个“-”占位符代替,历史原因导致还存在

$remote_user:远程客户端用户名称,用于记录浏览者进行身份验证时提供的名字,如登陆百度的用户名test,如果没有登陆就是空白。

[$time_lockal]:访问的时间与时区。

$request:请求的URLHTTP协议,这是真个PV日志记录中最有用的信息,记录服务器收到一个什么样的请求。

$status:记录请求返回的http状态吗,如成功是200

$body_bytes_sent:发送给客户端的文件主题内容的大小,如899,可以将日志每条记录中这个值累加起来初略估计服务器吞吐量。

$http_referer:记录从哪个页面链接访问过来。

$http_user_agent:客户端浏览器信息

$http_x_forwarded_for:客户端的真实ip,通常web服务器放在反向代理的后面,这样就不能获取到客户的ip地址,通过$remote_add拿到的ip地址是反向代理服务器的ip地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的ip地址和原来客户端的请求的服务器地址。

$ssl_protocol:ssl协议版本,如TLSv1

$ssl_cipher:交换数据中的算法。

$upstream_addr:upstream的地址,即真正提供服务器的主机地址。

$request_time:整个请求的总时间

$upstream_response_time:请求过程中upstream的响应时间

Client_max_body_size:用来设置允许客户端请求的最大的单个文件字节数。

Client_header_buffer_size:用来指定客户端请求头的headerbuffer大小。对于大多数请求,1KB的缓冲区大小已经足够,如果自定义了消息头或有更大的cookie,可以增加缓冲区大小。这里设置为32KB

Large_client_header_buffers:用来指定客户端请求中较大的消息头的缓存最大数量和大小,“4”为个数,“128K”为大小,最大缓存为4128KB

Sendfile:参数用于开启高效文件传输模式,将tcp_nopushtcp_nodely两个指令设置为on用于防止网络阻塞。

Keepalive_timeout:用于设置客户端连接保持活动的超时连接。在超过这个时间之后,服务器会关闭该连接。

Client_header_timeout:用于设置客户端请求头读取超时时间。如果超过这个时间,客户端还没有发送任何数据,nginx将返回“request time out(408)”错误。

Client_body_timeout:用于设置客户端请求主题读取超时时间,默认值为60.如果超过这个时间,客户端还没有发送任何数据,nginx将发后“request time out(408)”错误。

Send_timeout:用于指定响应客户端的超时时间,这个超时仅限于两个链接活动之间的时间,如果超过这个时间,客户端没有任何活动,nginx将会关闭连接。

3HTTP gzip模块配置

配置nginxhttp gzip模块,这个模块支持在线实时压缩输出数据流,经过良好的配置优化,可以大幅的提升网站的输出效率。要看是否安装此模块,使用如下命令:

[root@open ~]# /usr/local/nginx/sbin/nginx –V

技术分享

下面是httpgzip模块在nginx配置中相关属性设置:

gzip  on;    //开启gzip压缩

gzip_min_length 1k;  //压缩页面最小字节数

gzip_buffers 4  16k;  //申请4个单位16K内存作为压缩结果流缓存

gzip_http_version  1.1;  //设置识别http协议版本

gzip_comp_level  2;  //指定gzip压缩比

gzip_types  text/plain applicatio/x-javascript  text/css

           application/xml; //指定压缩类型

gzip_vary  on;

gzip:用于设置开启或者关闭gzip模块,“gzip  on”表示开启gzip压缩,实时压缩输出数据流。

Gzip_min_length:用于设置允许压缩的页面最小字节数,页面字节数从header头的content-length中获取。默认值是0,不管页面多大都进行压缩。建议设置成大于1K的字计数,小于1K可能会越压越大

Gzip_buffers:表示盛情4个单位为16K的内存作为压缩结果流缓存,默认值是盛情与原始数据大小相同的内存空间来存储gzip压缩结果。

Gzip_http_version:用于设置识别HTTP协议版本,默认是1.1,目前大部分浏览器已经支持gzip解压,使用默认即可。

Gzip_comp_level:用来指定gzip压缩比,1压缩比最小,处理速度最快,9压缩比最大,传输速度最快,但处理最慢,比较消耗CPU资源

Gzip_types:用来指定压缩的类型,无论是否指定,“text/html”类型总是会被压缩的。

Gzip_vary:选项可以让前端缓存服务器缓存经过gzip压缩的页面,例如,用squid缓存经过nginx压缩的数据。

3)        负载均衡配置

技术分享

Upstreamnginxhttp upstream模块,这个模块通过一个简单的调度算法来实现客户端IP到后端服务器的负载均衡。在上面的设定中,通过upstream指令指定了一个负载均衡器的名称为my_test。这个名称可以任意指定,在后面需要用到的地方直接调用即可。

Nginx负载模块支持4种调度算法:

轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响。

weight:指定轮询权值,weight值越大,分配到的访问几率越高,主要用于后端每个服务器性能不均的情况下。

ip_hash:每个请求按访问IPhash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,有效解决动态网页存在的session共享问题。但是仅仅能用ip来分配后端,因此ip_hash是有缺陷的

  • nginx不是前端的服务器,ip_hash要求nginx一定是最前端的服务器,否则nginx得不到正确ip,就不能根据iphash譬如使用的是squid最为前端,那么nginxip时只能得到squid服务器ip地址,用这个个地址来做分流肯定是错乱的。

  • Nginx的后端还有其他方式负载均衡,如果nginx后端又有其它负载均衡,将请求又通过另外的方式分流了,那么某个客户端的请求肯定不能定位到同一台session应用服务器上,这么算起来,nginx后端智能直接指向应用服务器,或者再搭一个squid,然后指向应用服务器,最好的办法是用location做一次分流,将需要session的部分请求通过ip_hash分流,剩下的走其它后端去。

fair:这是比上面两个更加智能的负载均衡算法,此种算法可以依据页面大小和加载时间长短智能的进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的有限分配。Nginx本身是不支持fair的,如果需要使用这种调度算法,必须下载nginxupstream_fair模块。

url_hash:此方法按访问urlhash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身是不支持url_hash的,如果需要使用这种调度算法,必须安装nginxhash软件包。

HTTPupstream 模块中,可以通过server指令指定后端服务器的IP地址和端口,同时还可以设定每个后端服务器在负载均很调度中的状态。常用的状态有:

down:表示当前的server暂时不参与负载均衡

backup:预留的备份机器,当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器压力最轻。

max_fails:允许请求失败的次数,默认为1,当超过最大次数时,返回proxy_next_upstream模块定义的错误。

fail_timeout:在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一期使用。

当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能是weightbackup

4)Server虚拟主机配置

Server{

listen  80;  //服务器监听端口

server_name localhost; //服务器IP地址或域名

index index.html  index.htm  index.php index.jsp;

root   /opt/html/ //网页根目录

charset gb2312;  //网页默认编码格式

access_log /data/logs/nginx_access.log  mylog;  //日志存放路径

error_log /data/logs/nginx_error.log;   //错误日志存放路径

}

Server标志定义虚拟主机开始,listen用于指定虚拟主机的服务器端口;server_name用来指定ip地址或者域名,多个域名之间用空格分开;index用于设定访问的默认首页地址;root指令用于指定虚拟主机的网页根目录,这个目录可以是相对路径,也可以是绝对路径;charset用于设置网页的默认编码格式。Access_log用来指定次虚拟主机的访问日志存放路径。最后的,mylog(myloghttp段内设置的日志输出格式,在access_log中引用)用于指定访问日志输出格式。

4)        URL匹配设置

URL地址匹配是nginx匹配中最灵活的部分。Location支持正则表达式匹配,也支持条件判断匹配,用户可以通过location指令实现nginx对动,静态网页的过滤处理。

以下设置是通过location指令来对网页URL进行分析处理,所有扩展名为.gif  .jpg .png  .bmp  .swf的静态文件都交给nginx处理,而expires用来指定静态文件的过期时间,这里是30

location  ~  .*\. (gif|jpg|jpeg|png|bmp|swf)$  {

         root  /opt/html/;

             expires 30d;

}

下面这段设置是将uploadhtml下的所有文件都交给nginx来处理,当然,uploadhtml目录包含在/opt/html/目录中

location  ~  ^/(uplocad|html)/  {

      root  /opt/html/;

          expires 30d;

}

location语法规则:

location [=|~|~*|^~|] /uri/ {...}

=:精确匹配,如果这个查询匹配,将停止搜索并立即处理此请求

~:~开头表示区分大小写匹配的正则表达式

~*:以此为开头表示不区分大小写的正则表达式

^~:如果把这个前缀用于一个常规字符串,那么告诉nginx如果路径匹配那么不测试正则表达式。

示例1

location  /  {}   //匹配任何查询,因为所有请求都以/开头。但是正则表达式规则将被优先和查询匹配。

示例2

location =/  {}  //仅仅匹配/

示例3

location ~*  .(gif|jpg|jpeg)$  {

        Rewrite  .(gif|jpg)$ /logo.png;

}  //不区分大小写匹配任何以gif,jpg,jpeg结尾的文件。

5)        stubstatus模块配置

stubstatus模块能够获取nginx自上次启动以来的工作状态,此模块非核心模块,需要在nginx编译安装时手工指定才能使用。

location /NginxStatus  {

      stub_status  on;

           access_log  logs/nginxstatus.log;

           auth_basic  “nginxstatus”;

      auth_basic_user_file  ../htpasswd;

}

stub_status为“on”表示启用stubstatus的工作状态统计功能;access_log用来指定stubstatus模块的访问日志文件;auth_basicnginx的一种认证机制;auth_basic_user_file用来指定认证的密码文件,因此需要用apachehtpasswd命令来生成密码文件。例如添加一个webadmin用户:

[root@open ~]# htpasswd -c/usr/local/nginx/conf/htpasswd webadmin

技术分享

在浏览器中输入:http://ip/nginxstatus输入刚创建的用户名密码登陆

技术分享

登陆后的页面:

 

技术分享

Active connections表示当前活跃的连接数,第三行3个数字表示nginx当前共处理了3个连接,成功建立了3次握手,总共处理了5个请求。最后一行的reading表示nginx读取到客户端header信息数;writing表示nginx返回给客户端的header信息数,waiting表示nginx已经处理完,正在等候下一次请求指令时的驻留连接数。

6)        nginx的启动,关闭和平滑重启

nginx自身提供了一些用于日常维护的命令:

检查nginx配置文件的正确性:

/usr/local/nginx/sbin/nginx  -t -c /usr/local/nginx/conf/nginx.conf

上述:“-t”参数用于检查配置文件是否正确,但并不执行。“-c”参数用于指定配置文件路径,如果不指定配置文件路径,nginx默认会在安装时指定的安装目录下查找conf/nginx.conf文件。

检测如下信息说明配置文件正确:

技术分享

显示nginx的版本以及相关编译信息:

/usr/local/nginx/sbin/nginx  -V

显示安装nginx版本信息

/usr/local/nginx/sbin/nginx  -v

Nginx的启动,关闭与重启

Nginx对进程的控制能力非常强大,可以通过信号指令控制进程,常用的信号:

  • QUIT:表示处理完当前请求后,关闭进程。

  • HUP:表示重新加载配置,也就是关闭原有的进程,并开启新的工作进程。此操作不会中断用户的访问请求,因此可以通过此信号平滑的重启nginx

  • USR1:用于nginx的日志切换,也就是重新打开一个日志文件,例如每天要生成一个新的日志文件时,可以使用这个信号来控制。

  • USR2:用于平滑升级可执行程序。

  • WINCH:从容关闭工作进程。

Nginx的启动命令:

/usr/local/nginx/sbin/nginx

查看nginx启动进程:

Ps  -ef  | grep  nginx

技术分享

关闭nginx

Kill  -xxx  pid //xxx是信号名,pid是进程号

Killall  -9  nginx    //强制杀死nginx所有进程。慎用。

Nginx平滑重启(不间断的重新启动nginx

Kill  -HUP  ‘cat /usr/local/nginx/logs/nginx.pid’

 


本文出自 “追求探索” 博客,请务必保留此出处http://caesar1990.blog.51cto.com/8821483/1727287

nginx学习笔记

标签:nginx   学习   整理   

原文地址:http://caesar1990.blog.51cto.com/8821483/1727287

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!