一、nginx功能介绍
Nginx因为它的稳定性、丰富的模块库、灵活的配置和低系统资源的消耗而闻名.业界一致认为它是Apache2.2+mod_proxy_balancer的轻量级代替者,不仅是因为响应静态页面的速度非常快,而且它的模块数量达到Apache的近2/3。
对proxy和rewrite模块的支持很彻底,还支持mod_fcgi、ssl、vhosts ,适合用来做mongrel clusters的前端HTTP响应。
nginx和Apache一样使用模块化设计,nginx模块包括内置模块和第三方模块,其中内置模块中包含主模块和事件模块。
nginx处理请求逻辑图
二、nginx可以提供的服务
web 服务.
负载均衡 (反向代理)
web cache(web 缓存)
三、nginx 的优点
- 高并发。静态小文件
- 占用资源少。2万并发、10个线程,内存消耗几百M。
- 功能种类比较多。web,cache,proxy。每一个功能都不是特别强。
- 支持epoll模型,使得nginx可以支持高并发。
- nginx 配合动态服务和Apache有区别。(FASTCGI 接口)
- 利用nginx可以对IP限速,可以限制连接数。
- 配置简单,更灵活。
四、nginx应用场合
- 静态服务器。(图片,视频服务)另一个lighttpd。并发几万,html,js,css,flv,jpg,gif等。
- 动态服务,nginx——fastcgi 的方式运行PHP,jsp。(PHP并发在500-1500,MySQL 并发在300-1500)。
- 反向代理,负载均衡。日pv2000W以下,都可以直接用nginx做代理。
- 缓存服务。类似 SQUID,VARNISH。
五、主流web服务产品对比说明
5.1 Apache-特性
- 2.2版本本身稳定强大,据官方说:其2.4版本性能更强。
- prefork模式取消了进程创建开销,性能很高。
- 处理动态业务数据时,因关联到后端的引擎和数据库,瓶颈不在与Apache本身。
- 高并发时消耗系统资源相对多一些。
- 基于传统的select模型。
- 扩展库,DSO方法。
5.2 nginx-特性
- 基于异步IO模型,(epoll,kqueue),性能强,能够支持上万并发。
- 对小文件支持很好,性能很高(限静态小文件1M)。
- 代码优美,扩展库必须编译进主程序。
- 消耗代码资源比较低。
- lighttpd(百度贴吧,豆瓣)
- 基于异步IO模式,性能和nginx相近。
- 扩展库是SO模式,比nginx要灵活。
- 通过差距(mod_secdownload)可实现文件URL地址加密。
5.3 web服务产品性能对比测试
5.3.1 静态数据性能对比
- 处理静态文件Apache性能比nginx和lighttpd要差。
- nginx在处理小文件优势明显。
- 处理静态小文件(小于1M),nginx和lighttpd比Apache更有优势,lighttpd最强。
5.3.2 动态数据性能对比
- 处理动态内容三者相差不大,主要取决于PHP和数据库的压力。
- 当处理动态数据时,三者差距不大,从测试结果看,Apache更有优势一点。这是因为处理动态数据能力取决于PHP和后端数据的提供服务能力。也就是说瓶颈不在web服务器上。
- 一般PHP引擎支持的并发参考值300-1000,JAVA引擎并发300-1000,数据库的并发300-1000.
5.3.3 为什么nginx的总体性能比Apache高。
- nginx使用最新的epoll和kqueue网络IO模型,而Apache使用床头的select模式。
- 目前Linux下能够承受高并发访问的squid、Memcached 都采用的是epoll网络IO模型。
5.3.4 如何选择WEB服务器:
静态业务:高并发、采用nginx,lighttpd,根据自己的掌握程度或公司的要求。
动态业务:采用nginx和Apache均可。
既有静态业务又有动态业务:nginx或Apache,不要多选要单选。
动态业务可以由前端代理(haproxy),根据页面元素的类型,向后转发相应的服务器进行处理。
思想:我们工作都不要追求一步到位,满足需求的前提下,先用,然后逐步完善。
提示:nginx做web(Apache,lighttpd)、反向代理(haproxy,lvs,nat)及缓存服务器(squid)也是不错的。
最终建议:对外的业务nginx,对内的业务Apache(yum httpd mysql-server php)。
六、nginx监控
开启nginx的监控服务
6.1 开启状态页
#设定查看Nginx状态的地址 location /status { stub_status on; #表示开启stubStatus的工作状态统计功能。 access_log off; #access_log off; 关闭access_log 日志记录功能。 #auth_basic "status"; #auth_basic 是nginx的一种认证机制。 #auth_basic_user_file conf/htpasswd; #用来指定密码文件的位置。 }
6.2 配置登录密码
yum install -y httpd-tools /usr/local/apache/bin/htpasswd -c /data/nginx/conf/htpasswd biglittleant New password:
完成后会在/data/nginx/conf/
目录下生成htpasswd
文件。
6.3 访问URL
curl http://127.0.0.1/status Active connections: 1 server accepts handled requests 16 16 18 Reading: 0 Writing: 1 Waiting: 0 #active connections – 活跃的连接数量 #server accepts handled requests — 总共处理了16个连接 , 成功创建16次握手, 总共处理了18个请求 #Reading — 读取客户端的连接数: Writing 响应数据到客户端的数量; Waiting 开启 keep-alive 的情况下,这个值等于 active – (reading+writing), 意思就是 Nginx 已经处理完正在等候下一次请求指令的驻留连接.
6.4 编写zabbix监控脚本
nginx_status_fun(){ NGINX_PORT=$1 NGINX_COMMAND=$2 nginx_active(){ /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/status/" 2>/dev/null| grep 'Active' | awk '{print $NF}' } nginx_reading(){ /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/status/" 2>/dev/null| grep 'Reading' | awk '{print $2}' } nginx_writing(){ /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/status/" 2>/dev/null| grep 'Writing' | awk '{print $4}' } nginx_waiting(){ /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/status/" 2>/dev/null| grep 'Waiting' | awk '{print $6}' } nginx_accepts(){ /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/status/" 2>/dev/null| awk NR==3 | awk '{print $1}' } nginx_handled(){ /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/status/" 2>/dev/null| awk NR==3 | awk '{print $2}' } nginx_requests(){ /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/status/" 2>/dev/null| awk NR==3 | awk '{print $3}' } case $NGINX_COMMAND in active) nginx_active; ;; reading) nginx_reading; ;; writing) nginx_writing; ;; waiting) nginx_waiting; ;; accepts) nginx_accepts; ;; handled) nginx_handled; ;; requests) nginx_requests; esac }
七、nginx优化
7.1 nginx 内核优化
net.ipv4.tcp_fin_timeout = 2 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_keepalive_time = 600 net.ipv4.ip_local_port_range = 4000 65000 net.ipv4.tcp_max_syn_backlog = 16384 net.ipv4.tcp_max_tw_buckets = 36000 net.ipv4.route.gc_timeout = 100 net.ipv4.tcp_syn_retries = 1 net.ipv4.tcp_synack_retries = 1 net.core.somaxconn = 16384 net.core.netdev_max_backlog = 16384 net.ipv4.tcp_max_orphans = 16384 #以下参数是对iptables防火墙的优化,防火墙不开会提示,可以忽略不理。 net.ipv4.ip_conntrack_max = 25000000 net.ipv4.netfilter.ip_conntrack_max=25000000 net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=180 net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait=120 net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait=60 net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait=120
八、扩展一:nginx全局变量
$args:这个变量等于请求行中的参数,同$query_string。 $is_args: 如果已经设置$args,则该变量的值为"?",否则为""。 $content_length: 请求头中的Content-length字段。 $content_type: 请求头中的Content-Type字段。 $document_uri: 与$uri相同。 $document_root: 当前请求在root指令中指定的值。 $host: 请求主机头字段,否则为服务器名称。 $http_user_agent: 客户端agent信息。 $http_cookie: 客户端cookie信息。 $limit_rate: 这个变量可以限制连接速率。 $request_method: 客户端请求的动作,通常为GET或POST。 $remote_addr: 客户端的IP地址。 $remote_port: 客户端的端口。 $remote_user: 已经经过Auth Basic Module验证的用户名。 $request_body_file`: 客户端请求主体的临时文件名。 $request_uri: 请求的URI,带参数 $request_filename: 当前请求的文件路径,由root或alias指令与URI请求生成。 $scheme: 所用的协议,比如http或者是https,比如rewrite ^(.+)$ $scheme://example.com$1 redirect;。 $server_protocol: 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。 $server_addr: 服务器地址,在完成一次系统调用后可以确定这个值。 $server_name: 服务器名称。 $server_port: 请求到达服务器的端口号。 $request_uri: 包含请求参数的原始URI,不包含主机名,如:/foo/bar.php?arg=baz,它无法修改。 $uri: 不带请求参数的当前URI,$uri不包含主机名,如/foo/bar.html可能和最初的值有不同,比如经过重定向之类的。它可以通过内部重定向,或者使用index指令进行修改。不包括协议和主机名,例如/foo/bar.html。
参考:https://blog.csdn.net/qq_29677867/article/details/90112120