• 原创——Nginx基础


    Nginx基础

    一、Nginx概述:

      Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。

      Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的Rambler.ru 站点开发的,它已经在该站点运行超过四年多了。Igor 将源代码以类BSD许可证的形式发布。自Nginx 发布四年来,Nginx已经因为它的稳定性、丰富的功能集、 示例配置文件和低系统资源的消耗而闻名了。

       目前国内各大门户网站已经部署了Nginx,如新浪、网易、腾讯等;国内几个重要的视频分享网站也部署了Nginx,如六房间、酷6等。 新近发现Nginx 技术在国内日趋火热,越来越多的网站开始部署Nginx。

    二、相比主流的Apache,我为什么要选Nginx?

      Nginx才短短几年,就拿下了web服务器大笔江山,众所周知,Nginx在处理大并发静态请求方面,效率明显高于httpd,甚至能轻松解决C10K问题

    1、Nginx和Apache相比优点:
      轻量级:同样起web服务,比apache占用更少的内存及资源;   抗并发:nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能;   高度模块化的设计:编写模块相对简单;   社区活跃:各种高性能模块出品迅速。
    2、Nginx作为Web服务器:
      相比Apache,Nginx使用更少的资源,支持更多的并发连接,体现更高的效率。   Nginx作为负载均衡服务器:
      Nginx既可以在内部直接支持Rails和PHP程序对外进行服务, 也可以支持作为HTTP代理服务器对外进行服务. Nginx采用C进行编写, 不论是系统资源开销还是CPU使用效率都不错。   Nginx作为邮件代理服务器:
      Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器)。
    Nginx 启动特别容易, 并且几乎可以做到7
    *24不间断运行,即使运行数个月也不需要重新启动. 你还能够不间断服务的情况下进行软件版本的升级。
    3、Nginx配置简洁,Apache复杂:   Nginx静态处理性能比Apache高3倍以上;   Apache对PHP支持比较简单,Nginx需要配合其他后端(php-fpm或者fastcgi);   Apache的组件比Nginx多。
    4、Nginx与Apache最核心的区别:
      在于apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接(万级别)可以对应一个进程。
    5、nginx处理静态文件好,耗费内存少:
      apache有先天不支持多核心处理负载鸡肋的缺点,建议使用nginx做前端,后端用apache。大型网站建议用nginx自带的集群功能。
    6、从使用情况来看:
      nginx的负载能力比apache高很多。Nginx改完配置能-t测试一下配置有没有问题,apache重启的时候发现配置出错了,会很崩溃,改的时候都会非常小心翼翼现在看有好多集群站,前端nginx抗并发,后端apache集群,配合的也不错。
    7、nginx处理动态请求是鸡肋,一般动态请求要apache去做,nginx只适合静态和反向。

    8、Nginx优于apache的主要两点:
      1.Nginx本身就是一个反向代理服务器;
      2.Nginx支持7层负载均衡,Nginx可能会比apache支持更高的并发。

    10、你对web server的需求决定你的选择。大部分情况下Nginx都优于Apache,比如说静态文件处理PHP-CGI的支持、反向代理功能、前端apache、维持连接等等。在Apache+PHP(prefork)模式下,如果PHP处理慢或者前端压力很大的情况下,很容易出现Apache进程数飙升,从而拒绝服务的现象。
    11、可以看一下nginx lua模块:https://github.com/chaoslaw...apache比nginx多的模块,可直接用lua实现apache是最流行的,why?大多数人懒得更新到nginx或者学新事物。
    12、对于nginx,它配置文件写的很简洁,正则配置让很多事情变得简单运行效率高,占用资源少,代理功能强大,很适合做前端响应服务器
    13、Apache在处理动态有优势,Nginx并发性比较好,CPU内存占用低,如果rewrite频繁,那还是Apache较适合。

    三、3种web服务器工作模型比较:

      Web服务器要为用户提供服务,必须以某种方式,工作在某个套接字上。一般Web服务器在处理用户请求是,一般有如下三种方式可选择:

    多进程方式:为每个请求启动一个进程来处理。由于在操作系统中,生成进程、销毁进程、进程间切换都很消耗CPU和内存,当负载高是,性能会明显降低。
    优点: 稳定性!由于采用独立进程处理独立请求,而进程之间是独立的,单个进程问题不会影响其他进程,因此稳定性最好。
    缺点: 资源占用!当请求过大时,需要大量的进程处理请求,进程生成、切换开销很大,而且进程间资源是独立的,造成内存重复利用。
    
    多线程方式:一个进程中用多个线程处理用户请求。由于线程开销明显小于进程,而且部分资源还可以共享,因此效率较高。
    优点:开销较小!线程间部分数据是共享的,且线程生成与线程间的切换所需资源开销比进程间切换小得多。
    缺点:稳定性!线程切换过快可能造成线程抖动,且线程过多会造成服务器不稳定。
    
    异步方式:使用非阻塞方式处理请求,是三种方式中开销最小的。但异步方式虽然效率高,但要求也高,因为多任务之间的调度如果出现问题,就可能出现整体故障,因此使用异步工作的,一般是一些功能相对简单,但却符合服务器任务调度、且代码中没有影响调度的错误代码存在的程序。
    优点:性能最好!一个进程或线程处理多个请求,不需要额外开销,性能最好,资源占用最低。
    缺点:稳定性!某个进程或线程出错,可能导致大量请求无法处理,甚至导致整个服务宕机。

    四、编译安装Nginx

    1、安装Nginx

    #编译nginx环境前需要先把gcc等开发库之类提前装好;
    [root@realserver1 ~]# yum -y install gcc gcc-c++ automake autoconf libtool make
    #安装pcre是为了支持rewrite,
    #zlib是为了支持gzip压缩
    #openssl是为了支持https;
    [root@realserver1 ~]# yum install -y pcre-devel.x86_64 pcre-devel.x86_64  zlib.x86_64 zlib-devel.x86_64  openssl-devel.x86_64 openssl.x86_64
    [root@realserver1 ~]# groupadd www 
    [root@realserver1 ~]# useradd -r -g www www  -s /sbin/nologin   #运行nginx的用户和用户组
    [root@realserver1 nginx-1.8.1]# mkdir -pv /opt/application/nginx
    mkdir: created directory `/opt/application'
    mkdir: created directory `/opt/application/nginx'
    [root@realserver1 tools]# tar -xf nginx-1.8.1.tar.gz
    [root@realserver1 tools]# cd nginx-1.8.1
    [root@realserver1 nginx-1.8.1]# ./configure --prefix=/opt/application/nginx/ --user=www --group=www --with-http_stub_status_module --with-http_ssl_module --with-http_spdy_module --with-http_gzip_static_module --with-http_realip_module --with-ipv6
    # --with-http_stub_status_module 启用nginx状态监控
    # --with-http_ssl_module 启用HTTPS加密
    # --with-http_spdy_module 启用spdy支持,缩短为网页加载时间
    # --with-http_gzip_static_module  启用静态压缩
    # --with-http_realip_module 做代理时获取客户端真实IP
    # --with-ipv6 支持ipv6
    [root@realserver1 nginx-1.8.1]# make ;make install

     2、创建nginx启动脚本

    [root@realserver1 ~]# vim /etc/rc.d/init.d/nginx
    [root@realserver1 ~]# chmod 755 /etc/rc.d/init.d/nginx
    [root@realserver1 ~]# service nginx start
    Starting nginx:                                            [  OK  ]
    [root@realserver1 ~]# chkconfig --add nginx
    [root@realserver1 ~]# chkconfig nginx on
    [root@realserver1 ~]# chkconfig --list nginx
    nginx              0:off      1:off  2:on  3:on    4:on     5:on     6:off

    3、测试成功

    [root@realserver1 nginx-1.8.1]# curl -I localhost
    HTTP/1.1 200 OK
    Server: nginx/1.8.1
    Date: Thu, 03 Nov 2016 08:30:16 GMT
    Content-Type: text/html
    Content-Length: 612
    Last-Modified: Thu, 03 Nov 2016 08:28:24 GMT
    Connection: keep-alive
    ETag: "581af528-264"
    Accept-Ranges: bytes

    4、Nginx脚本内容

    #!/bin/sh
    #
    # nginx - this script starts and stops the nginx daemin
    #
    # chkconfig:   - 85 15
    # description:  Nginx is an HTTP(S) server, HTTP(S) reverse 
    #               proxy and IMAP/POP3 proxy server
    # processname: nginx
    # config:      /usr/local/nginx/conf/nginx.conf
    # pidfile:     /usr/local/nginx/logs/nginx.pid
    # Source function library.
    . /etc/rc.d/init.d/functions
    # Source networking configuration.
    . /etc/sysconfig/network
    # Check that networking is up.
    [ "$NETWORKING" = "no" ] && exit 0
    nginx="/opt/application/nginx/sbin/nginx"
    prog=$(basename $nginx)
    NGINX_CONF_FILE="/opt/application/nginx/conf/nginx.conf"
    lockfile=/var/lock/subsys/nginx
    start() {
        [ -x $nginx ] || exit 5
        [ -f $NGINX_CONF_FILE ] || exit 6
        echo -n $"Starting $prog: "
        daemon $nginx -c $NGINX_CONF_FILE
        retval=$?
        echo
        [ $retval -eq 0 ] && touch $lockfile
        return $retval
    }
    stop() {
        echo -n $"Stopping $prog: "
        killproc $prog -QUIT
        retval=$?
        echo
        [ $retval -eq 0 ] && rm -f $lockfile
        return $retval
    }
    restart() {
        configtest || return $?
        stop
        start
    }
    reload() {
        configtest || return $?
        echo -n $"Reloading $prog: "
        killproc $nginx -HUP
        RETVAL=$?
        echo
    }
    force_reload() {
        restart
    }
    configtest() {
      $nginx -t -c $NGINX_CONF_FILE
    }
    rh_status() {
        status $prog
    }
    rh_status_q() {
        rh_status >/dev/null 2>&1
    }
    case "$1" in
        start)
            rh_status_q && exit 0
            $1
            ;;
        stop)
            rh_status_q || exit 0
            $1
            ;;
        restart|configtest)
            $1
            ;;
        reload)
            rh_status_q || exit 7
            $1
            ;;
        force-reload)
            force_reload
            ;;
        status)
            rh_status
            ;;
        condrestart|try-restart)
            rh_status_q || exit 0
                ;;
        *)
            echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
            exit 2
    esac

     五、Nginx配置文件讲解

    1、Nginx安装文件组成

    主配置文件nginx.confconf.d/*.conf

    [root@realserver1 nginx]# tree -f .
    .
    ├── ./client_body_temp
    ├── ./conf
    │   ├── ./conf/fastcgi.conf
    │   ├── ./conf/fastcgi.conf.default
    │   ├── ./conf/fastcgi_params
    │   ├── ./conf/fastcgi_params.default
    │   ├── ./conf/koi-utf
    │   ├── ./conf/koi-win
    │   ├── ./conf/mime.types
    │   ├── ./conf/mime.types.default
    │   ├── ./conf/nginx.conf
    │   ├── ./conf/nginx.conf.default
    │   ├── ./conf/scgi_params
    │   ├── ./conf/scgi_params.default
    │   ├── ./conf/uwsgi_params
    │   ├── ./conf/uwsgi_params.default
    │   └── ./conf/win-utf
    ├── ./fastcgi_temp
    ├── ./html
    │   ├── ./html/50x.html
    │   └── ./html/index.html
    ├── ./logs
    │   ├── ./logs/access.log
    │   ├── ./logs/error.log
    │   └── ./logs/nginx.pid
    ├── ./proxy_temp
    ├── ./sbin
    │   └── ./sbin/nginx
    ├── ./scgi_temp
    └── ./uwsgi_temp
    
    9 directories, 21 files

     2、说说主配置./conf/nginx.conf文件

    Main

  • 相关阅读:
    SQL Analytic Functions 分析函数
    SQL Cumulative Sum累积求和
    Data import/export of Netezza using external table
    重复数据分析的三个常用语法distinct, group by, partition by
    数据库开发常备技能
    Versioned table in Netezza
    主元素判断
    数据结构考研模糊知识点2.1
    数据结构考研模糊知识点1.2
    数据结构考研模糊知识点1.1
  • 原文地址:https://www.cnblogs.com/zuoyang/p/6038703.html
Copyright © 2020-2023  润新知