Nginx的基本配置-1
- 默认启动Nginx时,使用的配置文件是: 安装路径/conf/nginx.conf 文件
可以在启动nginx的时候,通过-c来指定要读取的配置文件 - n 常见的配置文件有如下几个: nginx.conf:应用程序的基本配置文件 mime.types:MIME类型关联的扩展文件
fastcgi.conf:与fastcgi相关的配置 proxy.conf:与proxy相关的配置
sites.conf:配置Nginx提供的网站,包括虚拟主机 - n Nginx的进程结构 启动Nginx的时候,会启动一个Master进程,这个进程不处理任何客户端的
请求,主要用来产生worker进程,一个worker进程用来处理一个request。 - n Nginx模块分为:核心模块、事件模块、标准Http模块、可选Http模块、邮件模 块、第三方模块和补丁等
Nginx的基本配置-2
- Nginx基本模块:所谓基本模块,指的是Nginx默认的功能模块,它们提供的指
令,允许你使用定义Nginx基本功能的变量,在编译的时候不能被禁用,包括: 核心模块:基本功能和指令,如进程管理和安全
事件模块:在Nginx内配置网络使用的能力 配置模块:提供包含机制 - n 常见的核心模块指令,大部分都是放置在配置文件的顶部 具体的指令,请参看nginx的官方文档,非常详细,参见:
http://nginx.org/en/docs/ngx_core_module.html - n 常见的events模块指令,大部分都是放置在配置文件的顶部
具体的指令,在上面那个文档里面,命令的context为events的就是events 模块指令,只能在events里面使用
Nginx常用的核心模块指令
- 核心模块指令,重点看看:error_log、include、pid、user、worker_cpu_affinity、
worker_processes - error_log 日志有6个级别:debug|info|notice|warn|error|crit
Nginx支持将不同的虚拟主机的日志记录在不同的地方,如下示例:
http{ error_log logs/http_error.log error;server{ server_name one; access_log logs/one_access.log; error_log logs/one_error.log error; }server{ server_name two; access_log logs/two_access.log; error_log logs/two_error.log error; } }
]
注意:error_log off不是禁用日志,而是创建一个名为off的日志,要禁用日志,可以这么写:error_log
/dev/null crit;
Nginx的HTTP基本配置
Nginx的HTTP配置主要包括三个区块,结构如下:
http { //这个是协议级别 include mime.types; default_type application/octet-stream; keepalive_timeout 65; gzip on; server { //这个是服务器级别 listen 80; server_name localhost; location / { //这个是请求级别 root html; index index.html index.htm; } } }
Nginx的HTTP核心模块,包括大量的指令和变量,大都很重要,具体参见:
http://nginx.org/en/docs/http/ngx_http_core_module.html
Location区段-1
- Location区段,通过指定模式来与客户端请求的URI相匹配,基本语法如下: location [=|~|~*|^~|@]
pattern{……}
1:没有修饰符表示:必须以指定模式开始,如: server { server_name sishuok.com; location /abc { …… } } 那么,如下是对的:http://sishuok.com/abchttp://sishuok.com/abc?p1=11&p2=22http://sishuok.com/abc/http://sishuok.com/abcde
Location区段-2
2:= 表示:必须与指定的模式精确匹配,如: server { server_name sishuok.com; location = /abc { …… } } 那么,如下是对的:http://sishuok.com/abchttp://sishuok.com/abc?p1=11&p2=22如下是错的:http://sishuok.com/abc/http://sishuok.com/abcde
Location区段-3
3:~ 表示:指定的正则表达式要区分大小写,如: server { server_name sishuok.com; location ~ ^/abc$ { …… } } 那么,如下是对的:http://sishuok.com/abchttp://sishuok.com/abc?p1=11&p2=22如下是错的:http://sishuok.com/ABChttp://sishuok.com/abc/http://sishuok.com/abcde
Location区段-4
4:~* 表示:指定的正则表达式不区分大小写,如: server { server_name sishuok.com; location ~* ^/abc$ { …… } } 那么,如下是对的:http://sishuok.com/abchttp://sishuok.com/ABChttp://sishuok.com/abc?p1=11&p2=22如下是错的:http://sishuok.com/abc/http://sishuok.com/abcde
Location区段-5
- 5:^~ 类似于无修饰符的行为,也是以指定模式开始,不同的是,如果模式匹配, 那么就停止搜索其他模式了。
- 6:@ :定义命名location区段,这些区段客户段不能访问,只可以由内部产生的请
求来访问,如try_files或error_page等
查找顺序和优先级
1:带有“=“的精确匹配优先
2:没有修饰符的精确匹配
3:正则表达式按照他们在配置文件中定义的顺序
4:带有“^~”修饰符的,开头匹配
5:带有“~” 或“~*” 修饰符的,如果正则表达式与URI匹配
6:没有修饰符的,如果指定字符串与URI开头匹配
Location区段匹配示例
location = / { # 只匹配/ 的查询. [ configuration A ] }location / { # 匹配任何以/ 开始的查询,但是正则表达式与一些较长的字符串将被首先匹配。 [ configuration B ] }location ^~ /images/ { # 匹配任何以/images/ 开始的查询并且停止搜索,不检查正则表达式。 [ configuration C ] }location ~* \.(gif|jpg|jpeg)$ { # 匹配任何以gif, jpg, or jpeg结尾的文件,但是所有/images/ 目录的请求将在Configuration C中处 理。 [ configuration D ] }各请求的处理如下例: ■/ → configuration A ■/documents/document.html → configuration B ■/images/1.gif → configuration C■/documents/1.jpg → configuration D
Http反向代理
- Nginx通常被用作后端服务器的反向代理,这样就可以很方便的实现动静分离, 以及负载均衡,从而大大提高服务器的处理能力。
- Http Proxy模块,功能很多,最常用的是proxy_pass,最好还是都看看。
- 如果要使用proxy_cache的话,需要集成第三方的ngx_cache_purge模块,用来清
除指定的URL缓存。这个集成需要在安装nginx的时候去做,形如:
./configure –add-module=../ngx_cache_purge-1.0 ……
动静分离
- Nginx实现动静分离,其实就是在反向代理的时候,如果是静态资源,那么就直 接从Nginx发布的路径去读取,而不需要从后台服务器获取了。
- 但是要注意:这种情况下需要保证后端跟前端的程序保持一致,可以使用Rsync
做服务端自动同步或者使用NFS、MFS分布式共享存储。
负载均衡
- Nginx通过upstream模块来实现简单的负载均衡
- 在upstream块内,定义一个服务器列表,默认的方式是轮询,如果要确定同一个
访问者发出的请求总是由同一个后端服务器来处理,可以设置ip_hash,如:
upstream cctest1.com { ip_hash server 127.0.0.1:9080 weight=5; server 127.0.0.1:8080 weight=5; server 127.0.0.1:1111; }
请注意:这个方法本质还是轮询,而且由于客户端的ip可能是不断变化的,比如动
态ip,代理,翻墙等等,因此ip_hash并不能完全保证同一个客户端总是由同一 个服务器来处理。
- 更多指令和配置,请参考Nginx的http负载均衡模块
Geo和GeoIP模块
这两个模块主要用于做全局的负载均衡,可以根据不同的客户端ip来访问不同的
服务器,示例如下:
http{ geo $geo{ default default; 202.103.10.1/24 A; 179.9.0.3/24 B; } upstream default.server{ server 192.168.0.100; } upstream A.server{ server 192.168.0.101; } upstream B.server{ server 192.168.0.102; } server{ listen 80; location / { proxy_pass http://$geo.server$request_uri; } } }
Rewrite模块配置-1
- Rewrite模块:用来执行URL重定向。这个机制有利于去掉恶意访问的url,也有 利于搜索引擎优化(SEO)。
- Nginx使用的语法源于Perl兼容正则表达式(PCRE)库,基本语法如下:
^ :必须以^后的实体开头
:必须以 前的实体结尾
. :匹配任意字符
[ ] :匹配指定字符集内的任意字符
[^ ] :匹配任何不包括在指定字符集内的任意字符串
| :匹配| 之前或之后的实体
() :分组,组成一组用于匹配的实体,通常会有|来协助 - 捕获子表达式,可以捕获放在()之间的任何文本,比如: ^(.*)(hello|sir) 字符串为“hisir”捕获的结果: 1=hi $2=sir 这些被捕获的数据,在后面就可以当变量一样使用了
Rewrite模块配置-2
内部请求 外部请求是客户端的url,内部请求是Nginx通过特殊的指令触发。
比如:error_page、index、rewrite、try_files、include等等内部请求分成两种类型
- 1:内部重定向:URI被改变,可能会匹配到其他的Location
2:子请求:比如使用Addition模块,指令add_after_body允许你在原始的URI之
内部重定向示例: server { server_name sishuok.com; location /abc/ { rewrite ^/abc/(.*)$ /bcd/$1 } location /bcd/{ internal; root pages; } }
Rewrite模块配置-3
条件结构的基本语法:
1:没有操作符:指定的字符串或者变量不为空,也不为0开始的字符串,取true
2:= , != ,例:if(
requestmethod=POST)…3: , ∗,! ,! ∗,例:if(
uri ~* “\.jsp ”)…4:−f,!−f:用来测试指定文件是否存在,例:if(−f
request_filename){…}
5:-d,!-d :用来测试指定目录是否存在
6:-e,!-e:用来测试指定文件、目录或者符号链接是否存在
7:-x,!-x:用来测试指定文件是否存在和是否可以执行
8:break:跳出if块
9:return:终止处理,并返回一个指定的http状态码
10:set:初始化或者重定义一个变量
其它模块-1
- Http Index模块,都看看
- Http Referer模块,都看看,可用于防盗链
- Http Limit Zone模块,都看看,可用于会话的连接数控制,如限制每个IP的并 发连接数等
- Http Access模块,用于简单的访问控制,都看看
- Http Charset模块,重点看看:charset
- Gzip模块,可以都看看
- Http Browser模块,用于按照请求头中的“User-agent”来创建一些变量,好为 不同的浏览器创建不同的内容,暂时了解即可
- Memcached模块,这是把Nginx当作Memcached的客户端,用来连接Memcached的模 块。暂时不用看
- Http Addition模块,可以在当前location内容之前或后添加内容,暂时不用看