• nginx学习笔记


    室内nginx技术交流

    简介:

    Nginx(发音同 engine x)是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev所开发,供俄国大型的入口网站及搜索引擎Rambler(俄文:Рамблер)使用。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,在中国使用nginx网站用户有:新浪网易、 腾讯等。

    特点:

    •1、高并发连接:官方测试能够支撑5万并发连接,在实际生产环境中跑到2~3万并发连接数。
    •2、内存消耗少:在3万并发连接下,开启的10个Nginx 进程才消耗150M内存(15M*10=150M)。
    •3、配置文件非常简单:配置文件非常简洁风格跟程序一样通俗易懂, (还能够支持perl语法)。
    •4、成本低廉:Nginx为开源软件,可以免费使用。而购买F5 BIG-IP、NetScaler等硬件负载均衡交换机则需要十多万至几十万人民币。
    •5、支持Rewrite重写规则:能够根据域名、URL的不同,将 HTTP 请求分到不同的后端服务器群组。
    •6、内置的健康检查功能:如果 Nginx Proxy 后端的某台 Web 服务器宕机了,不会影响前端访问。
    •7、节省带宽:支持 GZIP 压缩,可以添加浏览器本地缓存的 Header 头。
    •8、稳定性高:用于反向代理,宕机的概率微乎其微。 ,Bugs非常少的服务器,Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够不间断服务的情况下进行软件版本的升级
     
    安装:
    •Nginx在版本0.7.69 开始支持windows版本。

    在window下面安装很简单,下面已目前最新版本安装(nginx-1.5.6 )举例说明:

      在nginx官网下载nginx-1.5.6.zip安装包

      解压到指定目录(如 d:/nginx-1.5.6) 即可使用。

       进入到解压后的目录nginx-1.5.6

       启动: nginx.exe

       停止: nginx -s stop

       重启: nginx -s reload

    •进入到安装包目录,执行以下语句

    tar -zxvf  nginx-1.5.6.tar.gz

    •然后解压后目录输入

       cd nginx-1.5.6

    •接着开始编译源代码

          ./configure --user=wap7 --group=wap --prefix=/home/wap7/nginx1.5.6/ --with-openssl=/usr/local/openssl --without-http_proxy_module --without-http_rewrite_module --with-pcre=/usr/local/pcre-8.10

    • ./configure  有很多可选项,这里就几种常用的选项做一些说明
    •--user=<user> - 在nginx.conf中没有指定user指令的情况下,默认的nginx使用的用户。如果没有指定,默认为 nobody。
    •--group=<group> - 在nginx.conf中没有指定user指令的情况下,默认的nginx使用的组。如果没有指定,默认为 nobody。
    •--prefix=<path> - Nginx安装路径。如果没有指定,默认为 /usr/local/nginx。
    •--sbin-path=<path> - Nginx可执行文件安装路径。只能安装时指定,如果没有指定,默认为<prefix>/sbin/nginx。
    •--without-http_rewrite_module --with-pcre=/usr/local/pcre-8.10

     启用rewrite模块  需要用到pcre库

    •--with-openssl=/usr/local/openssl --without-http_proxy_module

     启用ssl连接 需要用到openssl库

    •make && make install

       安装完成 !

    •到安装目录的sbin目录下

        启动:./nginx

        停止:./nginx –s stop

        重启: ./nginx –s reload

    配置:

    全局配置

    •#启动进程,通常设置成和cpu的数量相等
    worker_processes  4;
    •#全局错误日志及PID文件

         error_log   logs/error.log;

          pid         conf/nginx.pid;

    •#工作模式及连接数上限
    events {
        use   epoll;             #epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能
        worker_connections  1024;#单个后台worker process进程的最大并发链接数
    }
    http节点配置
    •#设置http服务器,利用它的反向代理功能提供负载均衡支持
    http {
         #设定mime类型,类型由mime.type文件定义
        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;
        #设定日志格式
        access_log    /var/log/nginx/access.log;
    •   #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用,
        #必须设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.
        sendfile        on;
    •    #连接超时时间
        keepalive_timeout  65;

        
        #开启gzip压缩
        gzip  on;
        gzip_disable "MSIE [1-6].(?!.*SV1)";
    •    #设置请求缓冲
        client_header_buffer_size    1k;
        large_client_header_buffers  4 4k;

                include /etc/nginx/conf.d/*.conf;
                include /etc/nginx/sites-enabled/*;

    •    #设置负载均衡的服务器列表
         upstream mysvr {
        #weigth参数表示权值,权值越高被分配到的几率越大
        server 192.168.8.2:80  weight=1;
        server 192.168.8.3:80  weight=6;
        }

    server配置

    • server {
          #侦听80端口
            listen       80;
            #定义使用wapmail.10086.cn访问
            server_name  w;
    •        #设定本虚拟主机的访问日志
            access_log  logs/ wapmail.10086.cn.access.log  main;
    •    #默认请求
      location / {
              proxy_pass         http://wap_login_server; #对应一个upstream配置

                      client_max_body_size       100m; #客户端最大请求报文数据,超过这个值将拒绝请求

                     proxy_set_header   x-forward-for $remote_addr; #透传用户IP到后端服务器

                     proxy_set_header Host $host;

                    proxy_pass_header  Set-Cookie; #透传cookie到后端服务器
            }

    •    # 定义错误提示页面
        error_page   500 502 503 504 /50x.html;  
            location = /50x.html {
            root   /root;
        }
     
    upstream配置
     

    upstream 是nginx负载均衡的主要模块

    •#设置负载均衡的服务器列表 

     upstream wap_login_server {

            server 172.16.200.55:9000;

            server 172.16.200.56:9000;

        }

    默认是轮询负载策略,nginx提供四种负载策略

    1、轮询:(默认,weight  指定权重)

    2、ip_hash:  根据请求IP地址hash结果分配后台服务

    3、fair:按后端服务器的响应时间来分配请求,响应时间短的优先分配

    4、url_hash:按访问url的hash结果来分配请求

    location配置

    upstream 是nginx负载均衡的主要模块

    •#设置负载均衡的服务器列表 

     upstream wap_login_server {

            server 172.16.200.55:9000;

            server 172.16.200.56:9000;

        }

    默认是轮询负载策略,nginx提供四种负载策略

    1、轮询:(默认,weight  指定权重)

    2、ip_hash:  根据请求IP地址hash结果分配后台服务

    3、fair:按后端服务器的响应时间来分配请求,响应时间短的优先分配

    4、url_hash:按访问url的hash结果来分配请求

    rewrite配置

    •Rewrite语法

        rewrite regex replacement flag

    •其中flag标记有四种格式:
    last –  终止当前rewirte,继续匹配
    break – 中止rewirte,不在继续匹配
    redirect – 返回临时重定向的HTTP状态302
    permanent – 返回永久重定向的HTTP状态301
    • Rewrite可以放在server, location 和 if 模块中。
    •Rewrite主要的功能就是实现URL的重写,nginx的rewrite规则采用PCRE Perl兼容正则表达式的语法进行规则匹配,如果您需要nginx的rewrite功能,在编译nginx之前,需要编译安装PCRE库。
    •location /wp12/ {

            rewrite "^/wp12/(.*)$" /wp/$1 break;

            proxy_pass        http://wap_rm_wp_server;

             ……省略

          }

    将请求  /wp12/xxx.htm URL重写成 /wp/xxx.htm

    nginx管理

    •默认配置:log_format  main  ‘$host $remote_addr - $remote_user [$time_local] $request ‘ ‘“$status” $body_bytes_sent “$http_referer” ‘ ‘“$http_user_agent” “$http_x_forwarded_for”’;
    •我们使用nginx作为反向代理,代理后端部署的实际服务地址可能不止一个。我们要了解后端服务器的响应情况,就需要在log_format中增加几个变量。
    •下面列出几个重要的变量:
    •$status  $upstream_status :  响应的状态码(响应正常还是出错了?)
    •$request_time  $upstream_response_time :  关注性能必备!看看前台传输文件的时间,以及后台处理的时间。前者对了解网络状态有益,后者对了解服务性能有益。
    •$remote_addr  $upstream_addr :  用户的IP地址,后端服务的IP地址
    •$bytes_sent $body_bytes_sent  :  发送给用户端的数据量(包含HTTP头和不包含HTTP头)
    •$host $request :  最重要的,搞定具体域名具体URL,不抓瞎。
    •根据实际情况,把以上的变量组合放进log_format中。
     
    平滑重启

    如果改变了Nginx的配置文件(nginx.conf),想重启Nginx,可以发送系统信号给Nginx主进程的方式来进行。这样进程在处理完当前请求后,使用新的进程处理新的请求,然后关闭旧的进程。不过,在重启之前,要确认Nginx配置文件的语法是正确的,可通过如下命令测试配置文件是否正确:

    •/nginx_home/sbin/nginx -t -c /nginx_home/conf/nginx.conf
    •如果配置文件不正确,屏幕会提示配置文件的第几行出错: nginx:[emerg] invalid number of arguments in "autoindex" directive in /nginx_home/conf/nginx.conf:29

          nginx:configuration file /nginx_home/conf/nginx.conf test failed

    •如果配置文件正确,屏幕将提示以下两行信息:

    the configuration file /nginx_homeconf/nginx.conf syntax is ok

    configuration file /nginx_home/conf/nginx.conf  test is successful

    •这时候,就可以平滑重启了:
    •对于Nginx 0.8.x之前的版本 kill -HUP `cat /usr/local/nginx/logs/nginx.pid`
    对于Nginx 0.8.x之后的版本 /nginx_home/sbin/nginx -s reload

    平滑升级

    1、  备份旧版本的nginx可执行文件,复制新版本的nginx这行文件

                mv /opt/nginx/sbin/nginx /opt/nginx/sbin/nginx.old 

               cp objects/nginx /opt/nginx/sbin/nginx 

    2、  测试新版本nginx是否正常

    /opt/nginx/sbin/nginx –t –c /opt/nginx/conf/nginx.conf 

    3、  平滑升级nginx

    kill –USR2 `cat /nginx_home/logs/nginx.pid` 

    4、  旧版本Nginx的pid变为oldbin,这是旧版本和新版本的nginx同时运行,过一段时间等就nginx处理完用户请求后,执行下面操作

    5、  从容关闭旧版本的Nginx进程

    kill –WINCH `cat /nginx_home/logs/nginx.oldbin` 

    6、  决定是否升级到新版的nginx

    kill –HUP `cat /nginx_home/logs/nginx.oldbin` ##nginx在不重载配置文件启动工作进程 

    kill –QUIT `cat /nginx_home/logs/nginx.oldbin` ##关闭旧版nginx 

    7、验证nginx是否升级成功

         /nginx_home/sbin/nginx –V ###显示类似以下信息则升级成功 

        nginx version: nginx/1.2.9

    nginx实例

  • 相关阅读:
    [Git & GitHub] 利用Git Bash进行第一次提交文件
    Linux下 Unison 实现文件双向同步
    Linux SSH使用公钥私钥实现免登陆
    SSH自动断开连接的原因
    hosts.deny 和hosts.allow 配置不生效
    bind启动时提示953端口被使用
    Linux查询系统配置常用命令
    Linux 查硬件配置
    BIND rndc—使用说明
    rndc 错误解决 和 远程配置
  • 原文地址:https://www.cnblogs.com/wanghongye/p/5119092.html
Copyright © 2020-2023  润新知