nginx系列之一:nginx入门

一、nginx功能介绍

  Nginx因为它的稳定性、丰富的模块库、灵活的配置和低系统资源的消耗而闻名.业界一致认为它是Apache2.2+mod_proxy_balancer的轻量级代替者,不仅是因为响应静态页面的速度非常快,而且它的模块数量达到Apache的近2/3。

  对proxy和rewrite模块的支持很彻底,还支持mod_fcgi、ssl、vhosts ,适合用来做mongrel clusters的前端HTTP响应。

  nginx和Apache一样使用模块化设计,nginx模块包括内置模块和第三方模块,其中内置模块中包含主模块和事件模块。

nginx处理请求逻辑图

二、nginx可以提供的服务

  1. web 服务.

  2. 负载均衡 (反向代理)

  3. web cache(web 缓存)

三、nginx 的优点

  1. 高并发。静态小文件
  2. 占用资源少。2万并发、10个线程,内存消耗几百M。
  3. 功能种类比较多。web,cache,proxy。每一个功能都不是特别强。
  4. 支持epoll模型,使得nginx可以支持高并发。
  5. nginx 配合动态服务和Apache有区别。(FASTCGI 接口)
  6. 利用nginx可以对IP限速,可以限制连接数。
  7. 配置简单,更灵活。

四、nginx应用场合

  1. 静态服务器。(图片,视频服务)另一个lighttpd。并发几万,html,js,css,flv,jpg,gif等。
  2. 动态服务,nginx——fastcgi 的方式运行PHP,jsp。(PHP并发在500-1500,MySQL 并发在300-1500)。
  3. 反向代理,负载均衡。日pv2000W以下,都可以直接用nginx做代理。
  4. 缓存服务。类似 SQUID,VARNISH。

五、主流web服务产品对比说明

5.1 Apache-特性

  1. 2.2版本本身稳定强大,据官方说:其2.4版本性能更强。
  2. prefork模式取消了进程创建开销,性能很高。
  3. 处理动态业务数据时,因关联到后端的引擎和数据库,瓶颈不在与Apache本身。
  4. 高并发时消耗系统资源相对多一些。
  5. 基于传统的select模型。
  6. 扩展库,DSO方法。

5.2 nginx-特性

  1. 基于异步IO模型,(epoll,kqueue),性能强,能够支持上万并发。
  2. 对小文件支持很好,性能很高(限静态小文件1M)。
  3. 代码优美,扩展库必须编译进主程序。
  4. 消耗代码资源比较低。
  5. lighttpd(百度贴吧,豆瓣)
  6. 基于异步IO模式,性能和nginx相近。
  7. 扩展库是SO模式,比nginx要灵活。
  8. 通过差距(mod_secdownload)可实现文件URL地址加密。

5.3 web服务产品性能对比测试

5.3.1 静态数据性能对比

  1. 处理静态文件Apache性能比nginx和lighttpd要差。
  2. nginx在处理小文件优势明显。
  3. 处理静态小文件(小于1M),nginx和lighttpd比Apache更有优势,lighttpd最强。

5.3.2 动态数据性能对比

  1. 处理动态内容三者相差不大,主要取决于PHP和数据库的压力。
  2. 当处理动态数据时,三者差距不大,从测试结果看,Apache更有优势一点。这是因为处理动态数据能力取决于PHP和后端数据的提供服务能力。也就是说瓶颈不在web服务器上。
  3. 一般PHP引擎支持的并发参考值300-1000,JAVA引擎并发300-1000,数据库的并发300-1000.

5.3.3 为什么nginx的总体性能比Apache高。

  1. nginx使用最新的epoll和kqueue网络IO模型,而Apache使用床头的select模式。
  2. 目前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文件。

扫描二维码关注公众号,回复: 9835217 查看本文章

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

猜你喜欢

转载自www.cnblogs.com/FondWang/p/12497204.html