第6课:Nginx配置

Nginx默认配置文件为nginx.conf,当然你可以保持这个默认文件配置不变,然后在里面include一个新文件,在新文件里写自己的独立配置,也可以直接修改默认配置文件

首先打开nginx.conf,可以直接用vim nginx.conf命令打开,也可以把文件下载下来,改完之后放上去。这些不重要,重要的是修改之后一定要重启nginx才能生效
nginx重启命令:
/usr/local/services/nginx/sbin/nginx -s reload
这里假设nginx安装在/usr/local/services/nginx主要是找到nginx中的sbin/nginx这个文件来执行上面命令
当然了,nginx也有检查配置文件是否正确的命令,可以在重启之前运行
/usr/local/services/nginx/sbin/nginx -t

如果nginx是第一次启动,重启命令是无用的,可以用
/usr/local/services/nginx/sbin/nginx -c /usr/local/services/nginx/conf/nginx.conf
-c 后面是配置文件路径

以下列出常见的几种场景,以及配置方法,所有操作都是编辑nginx.conf文件实现
1.我们的代码放在/usr/local/app/code目录,想通过IP或者域名直接访问到这个目录中的文件,如何设置?

server {
	listen       80;
	server_name  10.21.3.101  www.godeye.org;
	root /usr/local/code;
	index index.php index.htm index.html;
	client_max_body_size 6000m;
	client_body_buffer_size 6000m;

	location ~ \.php {
	    fastcgi_pass 127.0.0.1:9000;
	    fastcgi_index index.php;
	    fastcgi_connect_timeout 10;
	    fastcgi_send_timeout 300;
	    fastcgi_read_timeout 300;
	    fastcgi_buffers 32 16k;
	    fastcgi_param SCRIPT_FILENAME  /usr/local/fdfs/$fastcgi_script_name;
	    include fastcgi_params;
	}
}

主要操作是在http{}代码块中增加一个server{}块
listen是设置nginx的监听端口,其实也是设置访问端口
server_name设置访问的IP与域名
root  设置服务器代码目录的位置
这3项是主要配置,其他可以自己根据需要配置

2.如果我有多台服务器,想配置负载均衡,如果一台访问压力大,会自动分担压力到其他服务器,该怎么设置?
主要通过upstream来实现
nginx 的 upstream目前支持4种方式的分配
1)轮询(默认)
      每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
2)weight
      指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
2)ip_hash
      每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。 
3)fair(第三方)
      按后端服务器的响应时间来分配请求,响应时间短的优先分配。 
4)url_hash(第三方)

upstream myServer {   
    server 127.0.0.1:9090 down;
    server 127.0.0.1:8080 weight=2;
    server 127.0.0.1:6060;
    server 127.0.0.1:7070 backup;
}

Nginx支持多组的负载均衡,可以配置多个upstream,来服务于不同的Server

3.有些图片或者文件,不需要每次都取,可以设置缓存,nginx里有专门模块来实现,可以满足基本需求,如果访问量很大,就要用第三方其他软件实现,这里只介绍nginx proxy cache缓存设置
proxy cache  默认只能缓存静态文件  peoxy pass location不能有正则,如果有就要rewrite  而且cache不能在一个端口完成,必须用多台机器或者多个端口实现
缓存文件夹写权限也要注意

主要在server中location设置来实现缓存
server {
	listen 81;
	server_name www.godeye.org 10.0.0.1;

	location / {
		rewrite ^/out/thumb(.*?)/(.*?)/?$ /index.php?a=out&thumb=$1&path=$2 last;
		rewrite ^/([a-zA-Z]+)/([0-9]+)/([a-zA-Z]+)/thumb(.*?)/(.*?)/?$ /index.php?a=$1&userid=$2&app=$3&thumb=$4&path=$5 last;
		proxy_cache content;
		proxy_ignore_headers cache-control;
		proxy_cache_valid 200 304 301 302 3d;    
		#proxy_cache_valid any 1h;    
		proxy_cache_key $host$uri$is_args$args;
	}
}
同时,http{}中也要加上如下代码
proxy_connect_timeout  5;
proxy_read_timeout     60;
proxy_send_timeout     5;
proxy_buffer_size      16k;
proxy_buffers          4 64k;
proxy_busy_buffers_size    128k;
proxy_temp_file_write_size 128k;
proxy_cache_path /usr/local/services/nginx/proxy_cache levels=1:2 keys_zone=content:500m inactive=1d max_size=30g;
主要设置缓存目录,超时时间等一些细节

4.URL重写,当你基本配置完成之后,发现访问的URL很长不优雅,就可以通过nginx 重写来优化URL
比如上面例子中的rewrite ^/out/thumb(.*?)/(.*?)/?$ /index.php?a=out&thumb=$1&path=$2 last;
访问http://www.test.com/out/thumb_100x100/test.jpg  就相当于访问http://www.test.com/index.php?a=out&thumb=_100x100&path=test.jpg

Rewrite的Flags
last - 基本上都用这个Flag。
break - 中止Rewirte,不在继续匹配
redirect - 返回临时重定向的HTTP状态302
permanent - 返回永久重定向的HTTP状态301
location = / {
    #规则A
}
location = /login {
    #规则B
}
location ^~ /static/ {
    #规则C
}
location ~ \.(gif|jpg|png|js|css)$ {
   #规则D
}
location ~* \.png$ {
   #规则E
}
location !~ \.xhtml$ {
   #规则F
}
location !~* \.xhtml$ {
   #规则G
}
location / {
   #规则H
}
访问根目录/, 比如http://localhost/ 将匹配规则A
访问 http://localhost/login 将匹配规则B,http://localhost/register 则匹配规则H
访问 http://localhost/static/a.html 将匹配规则C
访问 http://localhost/a.gif, http://localhost/b.jpg 将匹配规则D和规则E,但是规则D顺序优先,规则E不起作用,而 http://localhost/static/c.png 则优先匹配到 规则C
访问 http://localhost/a.PNG 则匹配规则E, 而不会匹配规则D,因为规则E不区分大小写