天天看点

nginx技术(2)nginx的配置详解

nginx的配置

1,启动nginx

1

2

3

4

5

6

7

<code>[root@centos6 nginx-</code><code>1.2</code><code>.</code><code>9</code><code>]# /usr/sbin/nginx -c /etc/nginx/nginx.conf   启动nginx</code>

<code>[root@centos6 nginx-</code><code>1.2</code><code>.</code><code>9</code><code>]# ps -ef|grep nginx   查看进程</code>

<code>root   </code><code>5479</code>   <code>1</code> <code>0</code> <code>04</code><code>:</code><code>15</code> <code>?    </code><code>00</code><code>:</code><code>00</code><code>:</code><code>00</code> <code>nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf</code>

<code>nginx   </code><code>5480</code> <code>5479</code> <code>0</code> <code>04</code><code>:</code><code>15</code> <code>?    </code><code>00</code><code>:</code><code>00</code><code>:</code><code>00</code> <code>nginx: worker process  </code>

<code>root   </code><code>5534</code> <code>2377</code> <code>0</code> <code>04</code><code>:</code><code>22</code> <code>pts/</code><code>1</code>  <code>00</code><code>:</code><code>00</code><code>:</code><code>00</code> <code>grep nginx</code>

<code>[root@centos6 nginx-</code><code>1.2</code><code>.</code><code>9</code><code>]# netstat -tulnp|grep nginx     查看nginx监听的端口</code>

<code>tcp    </code><code>0</code>   <code>0</code> <code>0.0</code><code>.</code><code>0.0</code><code>:</code><code>80</code>         <code>0.0</code><code>.</code><code>0.0</code><code>:*          LISTEN   </code><code>5479</code><code>/nginx.conf</code>

2,停止nginx

<code>从容停止nginx</code>

<code>[root@centos6 ~]# kill -QUIT $(cat /</code><code>var</code><code>/run/nginx/nginx.pid)</code>

<code>快速停止nginx</code>

<code>[root@centos6 ~]# kill -TERM $(cat /</code><code>var</code><code>/run/nginx/nginx.pid)</code>

<code> </code><code>强制停止所有的nginx</code>

<code>[root@centos6 ~]# kill -</code><code>9</code> <code>nginx</code>

3,重启nginx

<code>[root@centos6 ~]# kill -HUP $(cat /</code><code>var</code><code>/run/nginx/nginx.pid)</code>

<code> </code><code>检测nginx的配置文件的正确性</code>

<code>[root@centos6 ~]# /usr/sbin/nginx -t -c /etc/nginx/nginx.conf</code>

<code>nginx: the configuration file /etc/nginx/nginx.conf syntax </code><code>is</code> <code>ok</code>

<code>nginx: configuration file /etc/nginx/nginx.conf test </code><code>is</code> <code>successful</code>

4,nginx的配置

[root@centos6 rc0.d]# vim /usr/local/nginx/conf/nginx.conf

(1)全局模式

8

9

10

<code>#启动进程数,通常设置成和cpu的数量相等</code>

<code>worker_processes </code><code>1</code><code>;</code>

<code>#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]</code>

<code>error_log  logs/error.log info;</code>

<code>#进程文件</code>

<code>pid logs/nginx.pid;</code>

<code>worker_rlimit_nofile65535;</code>

<code>这个指令是指当一个nginx 进程打开的最多文件描述符数目,理论值应该是最多打开文</code>

<code>件数(ulimit -n)与nginx 进程数相除,但是nginx 分配请求并不是那么均匀,所以最好与ulimit -n的值保持一致。</code>

<code>现在在linux2.</code><code>6</code><code>内核下开启文件打开数为</code><code>65535</code><code>,worker_rlimit_nofile就相应应该填写</code><code>65535</code><code>。</code>

(2)工作模式

<code>#工作模式与连接数上限</code>

<code>events</code>

<code>{</code>

<code>#参考事件模型,</code><code>use</code> <code>[ kqueue | rtsig | epoll | /dev/poll | select | poll ];</code>

<code>epoll模型是Linux </code><code>2.6</code><code>以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。</code>

<code>use</code> <code>epoll;</code>

<code>#单个进程最大连接数(最大连接数=连接数*进程数)</code>

<code>worker_connections </code><code>65535</code><code>;</code>

<code>}</code>

进程的最大连接数受系统最大打开文件数的限制,在执行操作系统命令 ulimit -n 65535之后

worker_connections才会生效

(3)设定http服务器

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

<code>include</code> <code>mime.types; #文件扩展名与文件类型映射表</code>

<code>default_type application/octet-stream; #默认文件类型</code>

<code>#charset utf-</code><code>8</code><code>; #默认编码</code>

<code>server_names_hash_bucket_size </code><code>128</code><code>; #服务器名字的hash表大小</code>

<code>client_header_buffer_size 32k; #上传文件大小限制</code>

<code>large_client_header_buffers </code><code>4</code> <code>64k; #设定请求缓</code>

<code>client_max_body_size 8m; #设定请求缓</code>

<code>sendfile on; #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。</code>

<code>autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。</code>

<code>tcp_nopush on; #防止网络阻塞</code>

<code>tcp_nodelay on; #防止网络阻塞</code>

<code>keepalive_timeout </code><code>120</code><code>; #长连接超时时间,单位是秒</code>

<code>#FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。</code>

<code>fastcgi_connect_timeout </code><code>300</code><code>;</code>

<code>fastcgi_send_timeout </code><code>300</code><code>;</code>

<code>fastcgi_read_timeout </code><code>300</code><code>;</code>

<code>fastcgi_buffer_size 64k;</code>

<code>fastcgi_buffers </code><code>4</code> <code>64k;</code>

<code>fastcgi_busy_buffers_size 128k;</code>

<code>fastcgi_temp_file_write_size 128k;</code>

<code>#gzip模块设置</code>

<code>gzip on; #开启gzip压缩输出</code>

<code>gzip_min_length 1k; #最小压缩文件大小</code>

<code>gzip_buffers </code><code>4</code> <code>16k; #压缩缓冲区</code>

<code>gzip_http_version </code><code>1.0</code><code>; #压缩版本(默认</code><code>1.1</code><code>,前端如果是squid2.</code><code>5</code><code>请使用</code><code>1.0</code><code>)</code>

<code>gzip_comp_level </code><code>2</code><code>; #压缩等级</code>

<code>gzip_types text/plain application/x-javascript text/css application/xml;</code>

<code>#压缩类型,默认就已经包含textml,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。</code>

<code>gzip_</code><code>var</code><code>y on;</code>

<code>#limit_zone crawler $binary_remote_addr 10m; #开启限制IP连接数的时候需要使</code>

<code>设置允许客户端请求的最大的单个文件的字节数</code>

<code>   </code><code>client_max_body_size 20m;</code>

<code>设置客户端的请求头的header buffer的大小。对于大多数请求,1kb的的大小就够了。如果自定义了消息头或者有更大的cookie,那么就可以增加其大小了</code>

<code>    </code><code>client_header_buffer_size 32k;</code>

<code>用来指定客户端请求中较大的消息头缓存的最大数量和大小,这里的意思是</code><code>4</code><code>为个数,32k为大小 </code>

<code> </code><code>large_client_header_buffers </code><code>4</code> <code>32k;</code>

<code>设置客户端请求头的读取超时时间   超过这个时间就会返回</code><code>408</code>

<code>    </code><code>client_header_timeout </code><code>10</code><code>;</code>

<code>设置客户端请求主体读取超时时间  超过这个时间就会返回</code><code>408</code>

<code>    </code><code>client_body_timeout </code><code>10</code><code>;</code>

<code>指定响应客户端的超时时间。这个时间仅仅限于两个连接活动之间的时间,如果超过这个时间,客户端没有任何活动,nginx就会关闭连接</code>

<code>    </code><code>send_timeout  </code><code>10</code><code>;</code>

(4)负载均衡配置

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

<code>nginx 的upstream目前支持</code><code>4</code><code>种方式的分配</code>

<code>1</code><code>、轮询(默认)</code>

<code>每个请求按时间顺序逐一分配到不同的后端服务器 ,如果后端服务器down掉,能自动剔除。</code>

<code>2</code><code>、weight</code>

<code>指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。</code>

<code>例如:</code>

<code>    </code><code>upstream bakend {</code>

<code>         </code><code>server </code><code>192.168</code><code>.</code><code>0.14</code> <code>weight=</code><code>10</code><code>;</code>

<code>         </code><code>server </code><code>192.168</code><code>.</code><code>0.15</code> <code>weight=</code><code>10</code><code>;</code>

<code>    </code><code>}</code>

<code>2</code><code>、ip_hash</code>

<code>每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session 的问题。</code>

<code>         </code><code>ip_hash;</code>

<code>         </code><code>server </code><code>192.168</code><code>.</code><code>0.14</code><code>:</code><code>88</code><code>;</code>

<code>         </code><code>server </code><code>192.168</code><code>.</code><code>0.15</code><code>:</code><code>80</code><code>;</code>

<code>3</code><code>、fair(第三方)</code>

<code>按后端服务器的响应时间来分配请求,响应时间短的优先分配。</code>

<code>upstream backend {</code>

<code>    </code><code>server server1;</code>

<code>    </code><code>server server2;</code>

<code>    </code><code>fair;</code>

<code>4</code><code>、url_hash(第三方)</code>

<code>按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。</code>

<code>例:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法</code>

<code>    </code><code>server squid1:</code><code>3128</code><code>;</code>

<code>    </code><code>server squid2:</code><code>3128</code><code>;</code>

<code>    </code><code>hash   $request_uri;</code>

<code>    </code><code>hash_method crc32;</code>

<code>tips:</code>

<code>upstream bakend{#定义负载均衡 设备的Ip及设备状态</code>

<code>ip_hash;</code>

<code>    </code><code>server </code><code>127.0</code><code>.</code><code>0.1</code><code>:</code><code>9090</code> <code>down;</code>

<code>    </code><code>server </code><code>127.0</code><code>.</code><code>0.1</code><code>:</code><code>8080</code> <code>weight=</code><code>2</code><code>;</code>

<code>    </code><code>server </code><code>127.0</code><code>.</code><code>0.1</code><code>:</code><code>6060</code><code>;</code>

<code>    </code><code>server </code><code>127.0</code><code>.</code><code>0.1</code><code>:</code><code>7070</code> <code>backup;</code>

<code>在需要使用负载均衡的server中增加</code>

<code>proxy_pass http:</code><code>//bakend/ ;</code>

<code>每个设备的状态设置为:</code>

<code>1</code><code>.down 表示单前的server暂时不参与负载</code>

<code>2</code><code>.weight 默认为</code><code>1</code><code>.weight越大,负载的权重就越大。</code>

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

<code>4</code><code>.fail_timeout:max_fails次失败后,暂停的时间。</code>

<code>5</code><code>.backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。</code>

<code>nginx支持同时设置多组的负载均衡,用来给不用的server来使用。</code>

<code>client_body_in_file_only 设置为On 可以讲client post过来的数据记录到文件中用来做debug</code>

<code>client_body_temp_path 设置记录文件的目录 可以设置最多</code><code>3</code><code>层目录</code>

<code>location 对URL进行匹配.可以进行重定向或者进行新的代理 负载均衡</code>

(5)虚拟主机的配置

<code>server {</code>

<code> </code><code>listen </code><code>80</code> <code>default_server;</code>

<code> </code><code>server_name </code><code>192.168</code><code>.</code><code>87.133</code><code>;</code>

<code> </code><code>root /usr/html/www1;</code>

<code> </code><code>index index.html;</code>

<code> </code><code>}</code>

<code>http:</code><code>//192.168.87.133 就可以访问/usr/html/www1</code>

<code>server</code>

<code>#监听端口</code>

<code>listen </code><code>80</code><code>;</code>

<code>#域名可以有多个,用空格隔开</code>

<code>server_name www.ha97.com ha97.com;</code>

<code>index index.html index.htm index.php;</code>

<code>root /usr/html/ha97;</code>

#定义本虚拟主机的访问日志

access_log /var/log/loginx/ha97access.log access;

(6) URL配置

55

56

57

58

59

60

61

62

63

<code>语法规则: location [=|~|~*|^~] /uri/ { … }</code>

<code>= 开头表示精确匹配</code>

<code>^~ 开头表示uri以某个常规字符串开头,理解为匹配url路径即可。nginx不对url做编码,因此请求为/</code><code>static</code><code>/</code><code>20</code><code>%/aa,可以被规则^~ /</code><code>static</code><code>//aa匹配到(注意是空格)。</code>

<code>~ 开头表示区分大小写的正则匹配</code>

<code>~* 开头表示不区分大小写的正则匹配</code>

<code>!~和!~*分别为区分大小写不匹配及不区分大小写不匹配 的正则</code>

<code>/ 通用匹配,任何请求都会匹配到。</code>

<code>多个location配置的情况下匹配顺序为(参考资料而来,还未实际验证,试试就知道了,不必拘泥,仅供参考):</code>

<code>首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 /通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。</code>

<code>例子,有如下匹配规则:</code>

<code>location = / {</code>

<code>#规则A</code>

<code>location = /login {</code>

<code>#规则B</code>

<code>location ^~ /</code><code>static</code><code>/ {</code>

<code>#规则C</code>

<code>location ~ \.(gif|jpg|png|js|css)$ {</code>

<code>#规则D</code>

<code>location ~* \.png$ {</code>

<code>#规则E</code>

<code>location !~ \.xhtml$ {</code>

<code>#规则F</code>

<code>location !~* \.xhtml$ {</code>

<code>#规则G</code>

<code>location / {</code>

<code>#规则H</code>

<code>那么产生的效果如下:</code>

<code>访问根目录/, 比如http:</code><code>//localhost/将匹配规则A</code>

<code>访问 http:</code><code>//localhost/login将匹配规则B,http://localhost/register则匹配规则H</code>

<code>访问 http:</code><code>//localhost/static/a.html将匹配规则C</code>

<code>访问 http:</code><code>//localhost/a.gif, http://localhost/b.jpg将匹配规则D和规则E,但是规则D顺序优先,规则E不起作用,而 http://localhost/static/c.png则优先匹配到规则C</code>

<code>访问 http:</code><code>//localhost/a.PNG则匹配规则E,而不会匹配规则D,因为规则E不区分大小写。</code>

<code>访问 http:</code><code>//localhost/a.xhtml不会匹配规则F和规则G,http://localhost/a.XHTML不会匹配规则G,因为不区分大小写。规则F,规则G属于排除法,符合匹配规则但是不会匹配到,所以想想看实际应用中哪里会用到。</code>

<code>访问 http:</code><code>//localhost/category/id/1111则最终匹配到规则H,因为以上规则都不匹配,这个时候应该是nginx转发请求给后端应用服务器,比如FastCGI(php),tomcat(jsp),nginx作为方向代理服务器存在。</code>

<code>所以实际使用中,个人觉得至少有三个匹配规则定义,如下:</code>

<code>#直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,官网如是说。</code>

<code>#这里是直接转发给后端应用服务器了,也可以是一个静态首页</code>

<code># 第一个必选规则</code>

<code>proxy_pass http:</code><code>//tomcat:8080/index</code>

<code># 第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项</code>

<code># 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用</code>

<code> </code><code>root /webroot/</code><code>static</code><code>/;</code>

<code>location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {</code>

<code> </code><code>root /webroot/res/;</code>

<code>#第三个规则就是通用规则,用来转发动态请求到后端应用服务器</code>

<code>#非静态文件请求就默认是动态请求,自己根据实际把握</code>

<code>#毕竟目前的一些框架的流行,带.php,.jsp后缀的情况很少了</code>

<code>proxy_pass http:</code><code>//tomcat:8080/</code>

(7)自动索引及别名功能

<code> </code><code>root /usr/html;</code>

<code> </code><code>location /www1 {</code>

<code>  </code><code>autoindex on;  (如果有index.html文件会优先访问)</code>

<code>  </code><code>}</code>

<code> </code><code>location /i/ {</code>

<code>  </code><code>alias /etc/; (当访问http:</code><code>//192.168.87.133/i/的时候其实是访问/etc)</code>

(8)控制站点访问

<code>listen </code><code>80</code> <code>default_server;</code>

<code>server_name </code><code>192.168</code><code>.</code><code>87.133</code><code>;</code>

<code>root /usr/html;</code>

<code>index index.html;</code>

<code>location /www1 {</code>

<code> </code><code>autoindex on;</code>

<code> </code><code>deny </code><code>192.168</code><code>.</code><code>87.1</code><code>;</code>

<code> </code><code>allow </code><code>192.168</code><code>.</code><code>87.133</code> <code>; 当拒绝和允许冲突的话,按照次序生效,最前面的生效</code>

<code>location /i/ {</code>

<code> </code><code>alias /etc/;</code>

(9)身份验证

nginx的身份验证和apache的一样

<code>        </code><code>index  index.html index.htm;</code>

<code>        </code><code>auth_basic     </code><code>"nginx_auth"</code><code>;</code>

<code>        </code><code>auth_basic_user_file /usr/local/nginx/conf/htpassword;</code>

<code>        </code><code>}</code>

<code>[root@test4 nginx]# which htpasswd</code>

<code>/usr/bin/htpasswd</code>

<code>[root@test4 nginx]# htpasswd -c /usr/local/nginx/conf/htpassword webadmin</code>

<code>New password:</code>

<code>Re-type </code><code>new</code> <code>password:</code>

<code>Adding password </code><code>for</code> <code>user webadmin</code>

(10)状态检查

模块stubstatus需要在编译的时候手动指定才可以使用

<code>location /nginx_status {</code>

<code>  </code><code>stub_status on;</code>

<code>  </code><code>access_log off;</code>

<code>http:</code><code>//192.168.87.133/nginx_status</code>

(11)nginx的日志自动切割

nginx没有apache类似的cronolog的功能支持,但是可以通过nginx信号控制能的脚本来实现日志的自动切割

<code>#/bin/bash</code>

<code>mkdir -p /home/nginx/logs</code>

<code>savepath_log=</code><code>'/home/nginx/logs'</code>

<code>nginx_log=</code><code>'/usr/local/nginx/logs'</code>

<code>mkdir -p $savepath_log/$(date +%Y)/(date +%m)</code>

<code>mv $nginx_log/access.log  $savepath_log/$(date +%Y)/(date +%m)/access.$(date +%F).log</code>

<code>mv $nginx_log/error.log  $savepath_log/$(date +%Y)/(date +%m)/error.$(date +%F).log</code>

<code>kill -USER1 `cat /usrlocal/nginx/logs/nginx.pid`</code>

USER1信号是使nginx自动切换日志

本文转自陈仲阳0 51CTO博客,原文链接:http://blog.51cto.com/wolfword/1205176

继续阅读