http模块语法介绍
http框架中包含4个模块,http、upstream、server、location。
--
1.HTTP
--
http{...}中的指令,都是有http模块来解析的。常用指令也均在此模块中。代码块结构,请参考第5部分。
**内部常用参数**
```
include 引入文件
default_type 响应类型
tcp_nodelay 提高I/O性能
sendfile 开启高效文件传输模式
server_names_hash_bucket_size 优化服务器域名散列表大小
server_names_hash_max_size
send_timeout 响应客户端的超时时间,默认60秒
upstream 上游服务
server 服务器
log_foramt 日志格式 可自定义设置。
$remote_addr 远端的IP地址,客户的浏览器的IP
$time_local 访问时间
$status 状态码
$remote_user 访问nginx的用户
$request 客户端的请求地址
$body_bytes_send 传输给客户端的字节数,响应头不计算在内
$http_referer url跳转,用来记录从哪个页面链接访问过来的。
$http_user_agent 用户重点浏览器信息
$http_x_forwarded_for 用户真实IP,若出现多个,说明使用了多次代理。
proxy_cache_path 缓存文件路径及配置
参数后面直接跟换成文件路径,
levels=1:2 表示层级。1:2为两层。
keys_zone=my_cache:10m 这段代码是分配了10m的共享换成空间,名称是my_cache。
max_size=10g 表示最大缓存空间是10g。
inactive=60m 表示超过多长时间没用的换成内容会被覆盖。
use_temp_path=off 必须为off,避免不必要的资源浪费。
gzip 是否开启压缩,若开启则最少需要配置以下几个参数。
gzip_min_length 小于多少字节不进行压缩
gzip_comp_level 压缩等级,1-9,9压缩最高传输最快,消耗CPU最大。
gzip_types 哪些类型的文件需要进行压缩。
keepalive_timeout TCP链接超时时间。默认75秒,但是浏览器一般是60秒,所以这里设置60秒即可,若设置为0,则禁止了keepalive链接。
PS:
HTTP是一种无状态协议,客户端向服务器发送一个TCP请求,服务端响应完毕后会断开连接,如果客户端服务器,发送多个请求,每个请求都会建立独自的链接来传输数据。这样会极大浪费服务器资源。
HTTP有一个KeepAlive模式,塔告诉WebServer在处理完一个请求后,保持这个TCP链接,若链接收到来自客户端的其他请求,则服务端会利用这个未关闭的链接来处理请求,而不需要再建立一个新的链接。
KeepAlive在一段时间内保持打开状态,它们会在这段时间内占用资源,占用过多就会影响性能。Nginx使用keepalive_timeout来指定KeepAlive的超市时间。
Nginx处理的每个请求都有超时设置,如果能做好这些超时时间的限定,判断超时后资源被释放,用来处理其他请求,可以提升Nginx的性能。
```
2.Upstream
--
此模块包含在http内部 ,表示上游服务,需要在upstream关键词后跟1个变量名。
其中可以包含1个或多个服务器地址host:port。
代码块结构,请参考第5部分。
**内部常用参数**
```
server 服务地址
weight 权重 指定轮询几率,大多使用与服务器性能不一的情况下。
max_fails 失败多少次后,认为主机已经挂掉,踢出。服务器资源少的话,设置2-3次即可,多的话设置1次。
fail_timeout 踢出后重新探测时间
backup 备用服务
max_conns 允许最大连接数 可以根据服务器好坏来这只连接数,防止宕机。
slow_start 当节点恢复,不立即加入
max_fails=3 fail_timeout=30 => 表示在30秒内请求某一台服务器失败3次,则认为该服务宕机,然后等待30秒,这期间不会再把请求发送给这个服务,时间到后,会尝试1次,若失败则继续等待30秒,依次循环,知道服务正常。
```
3.Server
--
此模块,包含在http内部,每一个server,都是以个虚拟主机。
代码结构,请参考第5部分。
**内部常用参数**
```
listen 监听端口,可以是端口号,或在ID加端口号,若加IP则外部无法直接访问。
server_name 定义网站域名,多个用空格分割。
location 匹配路径
access_log 日志路径 可以针对每一个server设置它们自己的日志。
error_page 错误页 后面跟的参数为错误码,如500、502、503等.最后跟匹配到错误码时,要跳转到页面的 /50x.html。对应的location下,配置文件所在的路径。
index 定义站点的默认页面。
client_max_body_size 上次文件大小限制,默认1m,若有调整修改这个参数。
```
4.Location
--
此模块包含在server模块内。实现了请求细分处理,有的返回静态URI,有的分发给上有服务器。需要在location关键字后填写匹配路径,包括绝对、相对、正则表达式,代码结构,请参考第5部分。
**location语法规则**
```
location [=|~|~*|^~] /uri/{...}
/ => 以‘/’开头表示通配符,任何请求都能匹配到。
= => 以‘=’开头表示精确匹配
~ => 以‘~’开头表示区分大小写的正则表达式
~* => 以‘~*’开头表示不区分大小写的正则表达式
^~ => 以‘^~’开头表示uri以某个常规字符串开头,理解为匹配url路径即可。
!~ => 以‘!~’开头表示区分大写不匹配
!~* => 以‘!~*’开头表示不区分大小写不匹配
首先匹配‘=’,其次匹配‘^~’,然后按照文件中顺序匹配正则,最后交给‘/’匹配,匹配成功后停止。
匹配是从上往下扫描文档,location块的顺序,一定要排列好。如:若‘/’在最前面会导致所有以‘/’开头的链接全都匹配到它。其他类似这种‘/data’开头都将匹配不上。
```
**内部常用参数**
```
root 匹配的路径
alias 匹配的路径,使用此属性时路径结尾一定一定一定要加‘/’
proxy_set_header 头信息 包含Host 、X-Real-IP、X-Forwarded-For等头信息。
proxy_cache 缓存信息
proxy_pass 转发上游服务
PS:root和alias的区别:
主要在于nginx如何解释location后面的URI,这会使两者分别以不同的方式将请求映射到服务器文件上。
root的处理结果是 root + location
alias的处理是 使用alias路径替换location路径
alias是一个目录别名的定义。root则是最上层目录的定义。
alias结尾必须用用“/”,否则会找不到文件,而root则可有可无。
alias只能在location中使用,root可以不放在location中。
alias在使用正则匹配时,必须捕捉要匹配的内容并在指定的内容处使用。
以下为分别使用root和alias访问资源的示例:
访问地址:http://dota2.uuu9.com/static/PA.jpg
location /static/ {
root /data/DOTA2;
}
使用root时,服务器的资源地址为 /data/DOTA2/static/PA.jpg.
location /static/ {
alias /data/DOTA2/;
}
使用alias时,服务器的资源地址为 /data/DOTA2/PA.jpg.
```
5.代码结构
--
```
http{
include ....;
log_foramt main .....;
tcp_nodelay on;
sendfile on;
server_names_hash_bucket_size 64;
server_name_hash_max_size 2048;
gzip on;
gzip_min_length 512;
gzip_comp_level 6;
gzip_types text/plain text/css application/javascript text/javascript image/jpeg image/gif image/png;
proxy_cache_path /temp/nginxcache levels=1:2 keys_zone=mycache:10m max_size=10g inactive=60m use_temp_path=off;
upstream local {
server 127.0.0.1:8080 weight=1 max_conns=500 max_fails=3 fail_timeout=30;
server 101.200.85.138:8080;
...
}
server {
listen 80;
server_name manyang.bangnikeji.net;
access_log logs/host.access.log main;
client_max_body_size 10m;
location / {
alias web/
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root error;
}
location /static/ {
proxy_pass http://local;
proxy_set_header Host $host;
proxy_set_header X-Real_IP $remote_addr;
proxy_set_header X-Forwaded-For $proxy_add_x_forwarded_for;
proxy_cache mycache;
}
}
}
```
6.附
--
可能用到的一些全局变量
```
1.$args
2.$content_length
3.$content_type
4.$content_root
5.document_uri
6.$host
7.$http_user_agent
8.$http_cookie
9.$limit_rate
10.$request_body_file
11.$request_method
12.$remote_addr
13.$remote_port
14.$remote_user
15.$request_filename
16.$request_uri
17.$query
```