五、nginx 入门:nginx Http 服务器

键盘上的舞者
• 阅读 1836

HTTP 服务器主要是在客户端向其发送请求时 向客户端投递网页的 个软件 。

Nginx 的系统架构
HTTP 核心模块
使用 limits 防止滥用。
约束访问。
流媒体文件。
预定义变血。
SPDY 矛口 HTTP/2
使用 Nginx PHP-FPM
Nginx uWSGI 结合。

一、Nginx系统架构

nginx 包含一个单一的master进程和多个worker进程。所有这些进程都是单线程,并且设计为同时处理成千上万个连接。
worker进程是处理连接的地方,这个组件用于处理客户端请求的。Nginx 使用了操作系统事件机制来快速响应这些请求。
master进程负责读取配置文件、处理套接字、派生worker进程、打开日志文件和编译嵌入式的perl脚本。Nginx建立在一个模块化的方式之上,各个模块链接在 起成为 个管道来
处理连接和请求。

二、HTTP核心模块

http模块是Nginx的核心模块,通过http处理客户端的所有交互。

1、server指令
作用:开始一个新的上下文,
例一、两个server_name代表的意义一致

server { 
    listen 127.0.0.1:80; 
    server_name default.example.com; 
    server_name_in_redirect on;     #在该 Context 中,对任何由 Nginx 发布的重定向,该指令都使用Server name 指令的第 个值来激活
}    
server { 
    listen 127.0 . 0.1:80; 
    server_name www.example.com;
}

例二、处理没有host的

server { 
    server name ””;
}

2、Nginx中的日志

log_format指令允许你明确指定记录要记在的内容

http { 
    log_format vhost host $remote_addr - $remote_user [$time_local ]’’”$request ”$status $body_bytes_sent ’ ’”$http_referer””$http_user_agent ”’; 
                         # 地址-用户名-本地时间( %d /%b/%Y %H%M:%S %z)-请求信息 -该变量指定响应状态-该变量指定发送到客户端的字节数,不包括响应头
    log_format downloads ’ $time_iso8601 $host $remote_addr ’’” $request "$status $body_bytes_sent $request_ time ’; 
    
    
    open_log_file_cache max=lOOO inactive=60s; 
    access_ log logs/access.log; 
server { 
    server_name ~< (WWW\ • ) ? ( . + ) $ ; 
    access_ log logs/combined.log vhost; 
    access_log logs/$2/access .log; 
    location /downloads { 
    access_log logs/downloads.log downloads;
    }
  }
}

3、查找文件

例:

server { 
root home/customer/html ;  #统一设置了文件保存目录
location I { 
    index index .html index.htm; 
    }
location /downloads { 
    autoindex on ;
}

root:
try_files:该指令对于给定 参数测试文件的存在性。如果前面的文件都没有找到,那么最后的条目将会作为备用,所以确保最后 个路径或者命名的 location在,或者通过=< status code >设置 个返回状态代码

4、域名解析

5、客户端的交互

主要是客户端与上游服务器,的连接(IP地址、超时、存活时间等)和属性。

default_type 该指令设置响应的默认 MIME 类型。如果文件的 MIME 类型不能被types 指令指定的类型正确地匹配,那么将会使用该指令指定的类型 (MIME 类型指的用来标识区分浏览器中显示的内容如HTML、有 XML、有 GIF、还有 Flash …… 如 Content-Type: text/HTML)
erro_page 该指令定义一个用于访问的URL,在遇到设置的错误代码时将会由该 URI提供访问。使用=号参数可以改变响应代码。如果=号的参数为空,那么响应代码来自于后面的 URI ,在这种悄况下必须由某种上游服务器提供)
etag 对于静态资源,该指令禁止自动产生 ETag 响应头(默认值为 on)
if_modified_since 通过比较if_modified_since请求头的值,该指令控制如何修改晌应时间
recursive_error_pages 该指令启用 error page 指令(默认值为 off )实现多个重定向

例:

http { 
# a generic error page to handle any server-level err rs
error_page 500 501 502 503 504 share/examples/nginx/50x.html; 
server { 
    server_name www.example.com; 
    root /home/customer/html; 
    # for any files not found , the page located at 
    # /home/customer/html/404.html will be delivered 
    error_page 404 /404.html ;        #该指令定义一个用于访问的URL,在遇到设置的错误代码时将会由该 URI提供访问。

location / { 
    # any server-level errors for this host will be directed 
    # to a custom application handler 
    error_page 500 501 502 503 504 = @error_handler;  #该指令定义一个用于访问的URL,在遇到设置的错误代码时将会由该 URI提供访问。
    }
    location /microsite { 
        # for any non-existent files under the /microsite URI , 
        # the client will be shown a foreign page 
        error_page 404 http://microsite . example.com/404 . html ; 
        # the named location containing the custom error handler 
        }
location @error_handler { 
        # we set the default type here to ensure the browser 
        # displays the error page correctly 
        default_type text/html; 
        proxy_pass http://127.0.0.1:8080 ;
     }
    }
}

三、使用 limits 防止滥用。
限制访问方式次数的指令

limit_conn 该指令指定一个共享内存域(由指令 limit_conn_zone 配置),并且指定每个键.值对的是大连接数
limit_conn_log_level 由于配置了limit_conn指令,在nginx限制连接达到阀值,会产生错误日志,该指令用于指定设置日志级别
limit_conn_zone 指定一个key,限制在limit_conn作为第一个参数,第二个参数zone ,表明用于存储 key 的共享内存区名字、当前每个 key的连接数量以及 zone 的大小 (name :size)
limit_rate 该指令限制客户端下载内容的速率(单位为字节/秒〉。速率限制在连接级别,这意味着 个单 的客户可以打开多个连接增加其吞吐量
limit_rate_after 在完成设定的字节数之后,该指令启用 limit rate 限制
limit_req 在共享内存(同 limit_req_zone 起配置)中,对特定 key 设置并发请求能力的限制。并发数量可以通过第二个参数指定。如果要求在两个请求之间没有延时,那么需要配置第三个参数 nodelay
limit_req_log_level Nginx 使用了limit_req指令限制请求数量后 ,通过该指令指定在什么级别下报告日志记录。在这里延时(delay 〉记录级别要小于指示(indicated )级别
limit_req_zone 指定一个key,限制在limit_conn作为第一个参数,第二个参数zone ,表明用于存储 key 的共享内存区名字、当前每个 key的连接数量以及 zone 的大小 (name :size) 。第三个参数 rate,表明配置在受到限制之前,每秒( r/s )请求数,或者每分钟请求数( r/m)
max_ranges 该指令设置在 byte-range 请求中最大的请求数量。设置为 0禁用对 byte-range 的支持

实例:1个ip地址限制在10个连接

http { 
    limit_conn_ zone $binary rem te_addr zone=connections : l0m; 
    limit_conn_log_level notice ; 
server {
    limit_conn connections 10 ;
    }
}

实例二、单元时间内一个用户请求多少页面时,nginx会在第一个请求页面后插入一个延时,直到这段时间过去。

http { 
    limit_req_zone $binary_remote_addr zone=requests:l0m rate=lr/s;  #限制连接数为10 每秒限制1次访问
    limit_req log level warn; 
server { 
    limit_req_zone=requests burst=l0 nodelay
    }
}

实例三、限制每个客户端的带宽。这种方法可以确保 些客户端不会把所有可用的带宽占用完。警告 尽管 limit 指令是连接基础, 个允许打开多个连接的客户端仍然可以绕开这个限制。

location /downloads { 
    limit_rate SOOk;
}

允许小文件自由下载,大文件限制

location /downloads { 
    limit_rate_after lm;  #对limit_rate启用,限制1m以上的文件
    limit_rate 500k ;
}

小结综合:

http { 
    limit_conn_zone $binary_ remote_addr zone=ips:lOm;     #请求数量限制
    limit_conn_ zone $server_name zone=servers:lOm;     #请求数量限制
    limit_req_zone $binary_remote_addr zone=requests: lOm rate=lr/s;  #请求频率控制
    limit_conn_log_level notice ;         #连接达到阀值的日志级别
    limit_req_log_level warn;             #频率达到阀值日志打印的级别
    # immediately release socket buffer memory on timeout 
    reset_timedout_connection on ;      
    server { 
        # these limits apply to the whole virtual server 
        limit_conn ips 10;    
        # only 1000 simultaneous connections to the same server_name 
        limit_conn servers 1000 ; 
        
    location /search { 
        # here we want only the /search URL to be rate- limited 
        limit_req zone=requests burst=3 nodelay ; 
        }
        
    location /downloads { 
        # using limit_conn to ensure that each client is 
        # bandwidth-limited 
        # with no getting around it 
        limit_conn connections l ; 
        limit_rate_after lm ; 
        limit_rate 5OOk;
        }
    }
}

四、约束访问
上文提及了客户端与上游服务器连接的属性一些指令的设置,约束访问就来对一组特定的ip来进行访问限制。

allow 该指令允许从这个 IP 地址、网络或者值为 all 的访问
auth_basic 该指令启用基于 HTTP 基本认证。以字符串作为域的名字。如果设置为off ,那么表示 auth_basic 不再继承上级的设置
auth_basic_user_file 该指令指定一个文件的位置,该文件的格式为 username: password: comment ,用于用户认证。 password 部分需要使用密码算法加密处理。comment 是可选的部分
deny 该指令禁止从 IP 地址、网络或者值为 all 的访问
statisFy 如果前面的指令使用了 all 或者 any ,那么允许访问 默认值为 all.表示用户必须来自于一个特定的网络地址,并且输入正确的密码

实例一

location /stats { 
    allow 127.0.0.1; 
    deny all;
}

允许:本地访问/stats

实例二、

server { 
    server_name restricted.example.com; 
    auth_basic ”restricted"; #域的名字
    auth_basic_user_file conf/htpasswd;    # 指定用户验证文件在conf/htpasswd中
}

五、流媒体文件
nginx提供一定的流媒体支持

引用
flv 该指令在该 location 中激活 fl 模块
mp4 该指令在该 location 中激活 mp4 模块
mp4_buffer_size lm; mpv初始缓冲大小
mp4_max_buffer_size 20m; MP4最大缓冲
location /videos { 
    mp4 ; 
    mp4_buffer_size lm; 
    mp4_max_buffer_size 20m;
}

六、预定义变量

点赞
收藏
评论区
推荐文章
DevOpSec DevOpSec
5年前
nginx安全配置
安全是一个重要的问题,必须引起注意。1.nginx介绍nginx本身不能处理PHP(http://www.ttlsa.com/php/"php"),它只是个web服务器,当接收到请求后,如果是php请求,则发给php解释器处理,并把结果返回给客户端。nginx一般是把请求发fastcgi管理进程处理,fastcgi管理进程选择cgi子
Stella981 Stella981
4年前
Nginx与uWSGI交互
1\.更改uwsgi的配置文件uwsgi.iniuwsgi...使用nginx连接时,监控地址socket127.0.0.1:8080直接做web服务器时,所监控地址http127.0.0.1:80802\.在nginx配置文件中的路由模块添加uwsgi支持.
Stella981 Stella981
4年前
Linux下安装nginx实现伪分布
1.安装Nginx的编译环境gccyuminstallgccc2.nginx的http模块使用pcre解析正则表达式,所以安装perl兼容的正则表达式库yuminstallypcrepcredevel3.nginx使用zlib对http包的内容进行gzipyum
Easter79 Easter79
4年前
Tomcat & SVN
1\.Tomcat简介tomcat是一个web服务器,类似nginx,apache的httpnginx,http只能处理html等静态文件(jpg)网页分为静态网页(以.html或者.htm结尾的url地址)和动态网页nginx和http配合php就能够处理动态的网页(.php结尾)tomcat也可以处
Wesley13 Wesley13
4年前
4. Nginx模块
Nginx官方模块1.ngx\_http\_stub\_status\_modulehttp://nginx.org/en/docs/http/ngx\_http\_stub\_status\_module.html。(https://www.oschina.net/action/GoToLink?urlhttp%3A%2
Stella981 Stella981
4年前
Node
node.js应用程序由如下三部分组成1导入所需模块:使用require指令来加载node.js模块2创建服务器:服务器可以监听客户端请求,类似于apache、nginx等3接收请求与响应请求:接收客户端/浏览器发送过来的请求,将处理得到的数据返回如下是第一个例子//步骤1:导入所需模块//这里我们使用re
Stella981 Stella981
4年前
CentOS 7.6 源码安装搭建LNMP架构(Nginx、MYSQL、PHP)
LNMP架构LNMP是什么搭建环境搭建准备LNMP软件包搭建nginx搭建mysql数据库搭建php搭建Discuz!论坛LNMP是什么LNMP:Linux系统下NginxMySQLPHP这种网站服务器架构。Nginx是一个高性能的HTTP和
Stella981 Stella981
4年前
Nginx入门简介和反向代理、负载均衡、动静分离理解
场景Nginx简介Nginx("enginex")是一个高性能的HTTP和反向代理服务器特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。Nginx可以作为静态页面的web服务器,
Stella981 Stella981
4年前
HTTP协议与WebSocket协议对比
1.HTTP从根本上讲,HTTP还是半双工的协议,也就是说,在同一时刻流量只能单向流动:客户端向服务器发送请求(单向),然后服务器响应请求(单向)。2.WebSocketWebSocket是一种自然的全双工、双向、单套接字连接。使用WebSocket,一旦建立连接,服务器与客户端可以随时发送消息。与HTTP轮询不同,WebSocket只发有一个请
Wesley13 Wesley13
4年前
HTTP协议探究(序章)
1HTTP协议基于TCP协议(1)TCP三次握手连接HTTP客户端(Chrome浏览器):IP:192.168.1.47端口:59875MSS:1460HTTP服务器(Nginx服务器):IP:45.76.37.162
Stella981 Stella981
4年前
Nginx+Tomcat 动静分离实现负载均衡
作者:无脑仔的小明链接:http://www.cnblogs.com/wunaozai/0.前期准备使用Debian环境。安装Nginx(默认安装),一个web项目,安装tomcat(默认安装)等。1.一份Nginx.conf配置文件 定义Nginx运行的用户 和 用户组 如果对应服务器暴露在外面