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 ```