美文网首页
nginx 简介

nginx 简介

作者: 林ze宏 | 来源:发表于2018-06-27 22:01 被阅读0次

    简介

    nginx是轻量级、高性能的http和反向代理的web服务器。

    安装

    下载官网:http://nginx.org/en/download.html(右边选择要安装的版本复制链接地址,直接在Linux中直接 wget )

    1:安装准备: nginx依赖于pcre库,要先安装pcre
    yum install pcre pcre-devel
    
      cd /usr/local/src/
      wget http://nginx.org/download/nginx-1.4.2.tar.gz
      tar zxvf nginx-1.4.2.tar.gz
    
      cd nginx-1.4.2
      ./configure --prefix=/usr/local/nginx
      make && make install
    
    到这里,恭喜您,安装成功了。
    
    

    如果安装出现以下错误:

    • 若在“./configure”后方加入了“--with-http_gzip_static_module”(添加gzip压缩模块)提示以下错误:

    **./configure: error: the HTTP gzip module requires the zlib library. You can either disable the module by using –without-http_gzip_module option, or install the zlib library into the system, or build the zlib library statically from the source with nginx by using –with-zlib=<path> option.**

    则需要安装 “zlib-devel” 即可。SSH 执行以下命令:

    代码如下 复制代码

    yum install -y zlib-devel
    
    • You need a C++ compiler for C++ support

    缺少 c++ 编译器的原因

    yum install -y gcc gcc-c++
    
    • make[1]: *** [/usr/local/pcre/Makefile] Error 127.pcre指向错误

    指向源码包,不是编译安装后的包,所以

    ./configure –prefix=/export/lnmp/nginx-1.4.7 –with-pcre=../pcre-8.34
    

    启动

    安装完成后,紧接着启动
    
      cd /usr/local/nginx, 看到如下4个目录
      ./
       ....conf 配置文件  
       ... html 网页文件
       ...logs  日志文件 
       ...sbin  主要二进制程序
    
    [root@localhost nginx]# ./sbin/nginx
    
    如果出现:
    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
    ....
    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
    nginx: [emerg] still could not bind()
    
    说明:不能绑定80端口,80端口已经被占用
    (有时是自己装了apache,nginx等,还有更多情况是操作系统自带了apache并作为服务启动)
    解决: 把占用80端口的软件或服务关闭即可.
    
    执行:(查看80端口暂用的程序,kill)
    [root@localhost nginx]# netstat -antp(查看进程号和对应的程序名)
    [root@localhost nginx]# pkill -9 进程号
    

    信号量

    http://nginx.org/en/docs/control.html

    信号量
    查看Nginx的进程号
    ps -aux | grep nginx
    
    具体语法:
    Kill -信号选项 nginx的主进程号
    如:Kill -HUP 4873
    
    由于Nginx的进程号每次都会改变,Nginx把进程号存在于log/nginx.pid,所以,可以利好顿号 cat 
    如:
    [root@iZ2zeb5jdmrubzqdcwo2biZ nginx]# kill -HUP `cat ./logs/nginx.pid`
    
    • 除了使用信号量控制Nginx外,也可以使用其他的命令
    查看帮忙命令
    [root@localhost nginx]# ./sbin/nginx -h
    检测配置是否有无问题  
    [root@localhost nginx]# ./sbin/nginx -t
    
    [root@localhost nginx]# ./sbin/nginx -s reload 重读配置文件 相当于 -HUP
    [root@localhost nginx]# ./sbin/nginx -s stop 停止 相当于 -INT
    [root@localhost nginx]# ./sbin/nginx -s quit 优雅停止 相当于 -QUIT
    [root@localhost nginx]# ./sbin/nginx -s reopen 重新打开日志 相当于 -USR1
    
    

    基于域名、端口、IP配置的server

    域名本地测试时,可以在 host 中配置。

    nginx.conf:实际项目
    
    #user  nobody;
    // 有1个工作的子进程,可以自行修改,但太大无益,因为要争夺CPU,一般设置为 CPU数*核数
    worker_processes  1; 
    
    #error_log  logs/error.log;
    #error_log  logs/error.log  notice;
    #error_log  logs/error.log  info;
    
    #pid        logs/nginx.pid;
    
    
    events {
    // 一般是配置nginx连接的特性
    // 如1个word能同时允许多少连接
     worker_connections  1024; // 这是指 一个子进程最大允许连1024个连接
    
    }
    
    
    http { //这是配置http服务器的主要段
        include       mime.types;
        default_type  application/octet-stream;
    
        #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
        #                  '$status $body_bytes_sent "$http_referer" '
        #                  '"$http_user_agent" "$http_x_forwarded_for"';
    
        #access_log  logs/access.log  main;
    
        sendfile        on;
        #tcp_nopush     on;
    
        #keepalive_timeout  0;
        keepalive_timeout  65;
    
    // gzip 压缩
        gzip on;
        gzip_min_length 10k;
        gzip_buffers 32 8k;
        gzip_comp_level 6;
        gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif 
        gzip_vary off;
    
    
        server {
            listen       80;
            server_name  localhost;
    
            #charset koi8-r;
    
            #access_log  logs/host.access.log  main;
    
    // 前端项目打包后,放在nginx/html目录下,Nginx默认从Nginx安装的根目录开始寻找
    // 前端项目配置的访问url,斜杆 / ,指直接使用 localhost(或者服务器的IP) 访问
            location / {
               try_files $uri /index.html;
                root   html;
                index  index.html index.htm;
            }
    
    //  后台打的jar包,前端调用后台的所有api接口,都是以 /console 开头的。
    // 前端 ( location / ) 访问后台的api,会被转这个( location /console)这个 location 进行处理,后台通过启用监听的端口,jar包通过nohup 启动整个服务,就可以让前端调到对应的接口
            location /console {
                proxy_pass http://127.0.0.1:8090/console;
            }
    
            location /consoleTest {
                proxy_pass http://127.0.0.1:18090/consoleTest;
            }
    
            location /vcs/sensorynode {
                proxy_pass http://127.0.0.1:9090/vcs/sensorynode;
            }
         
            location /sensorynode {
                proxy_pass http://127.0.0.1:9090/vcs/sensorynode;
            }
    
            location /vcs/picsearch {
                proxy_pass http://127.0.0.1:19090/vcs/picsearch;
            }
     
        }
    
    }
    
    

    server 配置例子

    例子1:
      server {
            listen       80;
            server_name  zehomg.com; //通过域名,测试公网没有这个域名,可以通过本地配置 host 进行测试。
            location / {
                try_files $uri /index.html;
                root   zehong; // 项目存放的目录,从Nginx根目录开始寻找,这里配置的就是 nginx/zehong
                index  index.html index.htm;
            }
      }
    
    例子2:
      server {
            listen       2020;
            server_name  192.168.1.21; //通过IP
            location / {
                try_files $uri /index.html;
                root   /var/www/ip; // 项目存放的目录,是可以随便改的
                index  index.html index.htm;
            }
      }
    

    日志管理

    • 分别可以对server段,配置日志
    server {
      listen  80;
      server_name  zehong.com;
      location / {
        root zehong;
        index index.html;
      }
      
    access_log logs/zehong.com.access.log main;
    
    }
    
    
    说明:
    这说明 该server, 它的访问日志的文件是  logs/zehong.com.access.log ,
    使用的格式”main”格式.
    
    默认的日志格式说明: main 格式
         log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                                '$status $body_bytes_sent "$http_referer" '
                                '"$http_user_agent" "$http_x_forwarded_for"';
    
    默认的main日志格式,记录这么几项
    远程IP- 远程用户/用户时间 请求方法(如GET/POST) 请求体body长度 referer来源信息
    http-user-agent用户代理/蜘蛛 ,被转发的请求的原始IP
    
    http_x_forwarded_for:在经过代理时,代理把你的本来IP加在此头信息中,传输你的原始IP
    
    
    • 日志切割
    实际应用: shell+定时任务+nginx信号管理
    分析思路: 
    凌晨00:00:01,把昨天的日志重命名,放在相应的目录下
    再USR1信息号控制nginx重新生成新的日志文件
    
    具体脚本:runlog.sh
    #!/bin/bash
    base_path='/usr/local/nginx/logs'
    log_path=$(date -d yesterday +"%Y%m")
    day=$(date -d yesterday +"%d")
    mkdir -p $base_path/$log_path
    mv $base_path/access.log $base_path/$log_path/access_$day.log
    kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
    
    定时任务
    Crontab 编辑定时任务
    01 00 * * * /xxx/path/runlog.sh  每天0时1分(建议在02-04点之间,系统负载小;01 00 * * * 表示分 时 日 月 周)
    
    定时任务具体执行:查看定时任务相关知识
    crontab -e
    
    

    location

    location 有”定位”的意思, 根据Uri来进行不同的定位.

    location 的语法:中括号可以不写任何参数,此时称为一般匹配
    location [=|~|~*|^~] patt {
    
    }
    
    大类型可以分为3种:
    location = patt {} [精准匹配]
    
    location patt{} [一般匹配]
    
    location ~ patt{} [正则匹配]
    
    
    如何发挥作用?:
    1:首先看有没有精准匹配,如果有,则停止匹配过程.
    
    location = patt {
     config A
    }
    如果 $uri == patt,匹配成功,使用configA
    
    
    • 精准和一般匹配
    例子:
     location = / {  // 精准
       root /var/www/html/;
       index index.htm index.html;
     }
    
     location / {  // 一般
       root /usr/local/nginx/html;
       index index.html index.htm;
     }
    
    如果访问  [http://xxx.com](http://xxx.com)/
    定位流程是 
    
    1: 精准匹配中 ”/” ,得到index页为  index.htm
    
    2: 再次访问 /index.htm , 此次内部转跳uri已经是”/index.htm” ,
    根目录为/usr/local/nginx/html
    
    3: 最终结果,访问了 /usr/local/nginx/html/index.htm
    
    
    • 正则和一般匹配
    location / {
     root /usr/local/nginx/html;
     index index.html index.htm;
    }
    
    location ~ image {
     root /var/www/;
     index index.html;
    }
    
    如果我们访问(http://xx.com/image/logo.png)
    
    此时, “/” 与”/image/logo.png” 匹配,
    同时,”image”正则  与”image/logo.png”也能匹配,谁发挥作用?
    
    正则表达式的成果将会使用.
    图片真正会访问 /var/www/image/logo.png
    
    也就是正则会覆盖一般匹配。
    
    • 一般与一般匹配
    location / {
                 root   /usr/local/nginx/html;
                 index  index.html index.htm;
             }
     
    location /foo {
                root /var/www/html;
                 index index.html;
    }
    我们访问 http://xxx.com/foo
    对于uri “/foo”,   两个location的patt,都能匹配他们
    即 ‘/’能从左前缀匹配 ‘/foo’, 
    ‘/foo’也能左前缀匹配’/foo’,
    此时, 真正访问 /var/www/html/index.html 
    原因:’/foo’匹配的更长,因此使用之.;
    
    也就是一般匹配哪个长度较长,就用哪个。
    
    • 总结location命中过程
    1:先判断精准命中,如果命中,立即返回结果并结束解析过程
    2:判断普通命中,如果有多个命中,“记录”下来“最长”的命中结果
    (注意:记录但是不结束,最长的为准)
    3:继续判断正则表达式的解析结果,按匹配里的正则表达式顺序为准,
    由上到下开始匹配,一旦匹配成功一个,立即返回结果,并结束解析过程。
    
    延伸分析:
    1:普通命中顺序无所谓,是因为按照命中的长度来确定的
    2:正则命中跟顺序有关,是按照配置的从上往下匹配,只要匹配一个成功,就直接返回。
    

    rewrite


    gzip

    http://nginx.org/en/docs/http/ngx_http_gzip_module.html

    gzip配置的常用参数
    gzip on|off;  #是否开启gzip
    gzip_buffers 32 4K| 16 8K #缓冲(压缩在内存中缓冲几块? 每块多大?)
    gzip_comp_level [1-9] #推荐6 压缩级别(级别越高,压的越小,越浪费CPU计算资源)
    gzip_disable #正则匹配UA 什么样的Uri不进行gzip
    gzip_min_length 200 # 开始压缩的最小长度(再小就不要压缩了,意义不在)
    gzip_http_version 1.0|1.1 # 开始压缩的http协议版本(可以不设置,目前几乎全是1.1协议)
    gzip_proxied          # 设置请求者代理服务器,该如何缓存内容
    gzip_types text/plain  application/xml # 对哪些类型的文件用压缩 如txt,xml,html ,css
    gzip_vary on|off  # 是否传输gzip压缩标志
    
    
    注意: 
    图片/mp3这样的二进制文件,不必压缩
    因为压缩率比较小, 比如100->80字节,而且压缩也是耗费CPU资源的.
    比较小的文件不必压缩
    
    上下文:http, server, location, if in location;一般我们配置在server中
    
    一般项目需要配置的几个选项:
    gzip on;
    gzip_buffers 32 4k;
    gzip_comp_level 6;
    gzip_min_length 4000;
    gzip_types text/css text/xml application/x-javascript;
    
    

    nginx的缓存设置:expires

    格式  expires 30s;
          expires 30m;
          expires 2h;
          expires 30d;
    
    对图片进行缓存例子:
    location ~ * \.(jpg | jpeg | gif | png) {
      expires 1d;
    }
    
    
    

    Nginx反向代理与负载均衡

    • 反向代理 proxy_pass
    location ~ \.php$ {
      proxy_pass http://192.168.1.110:8080
    }
    说明:浏览器请求为PHP的时候,Nginx根据location配置的,通过proxy_pass 反向代理到具体的后台请求地址。
    
    location /console {
     proxy_pass http://127.0.0.1:8090/console;
    }
    说明:如前后端分离,这里浏览器调用以console 开头的api时候,就会反向代理到后台工程(也就是后台打的jar包)
    
    • 负载均衡

    后台jar启动停止脚本

    后台启动的jar包shell脚本

    start.sh:
    
    #!/bin/bash
    
    PROJECT_NAME=console.jar
    
    pid=`ps -ef|grep $PROJECT_NAME |grep -v "grep" |awk '{print $2}'`
    
    if [ $pid ] ; then
    
       echo "console is already running and pid=$pid"
    
    else
    
       echo "start success to start $PROJECT_NAME ...."
    
       nohup java -jar $PROJECT_NAME >/dev/null聽2>nohup.out &
    
    fi
    
    

    后台停止的jar包shell脚本

    stop.sh:
    
    #!/bin/bash
    
    PROJECT_JAR=console.jar
    PROJECT_NAME=console
    PROJECT_LOG=console.*.log
    
    pid=`ps -ef|grep $PROJECT_JAR | grep -v "grep" | awk '{print $2}'`
    
    log_pid=`ps -ef|grep $PROJECT_LOG | grep -v "grep" | awk '{print $2}'`
    
    if [ $pid ] ; then
    
       echo "Stopping the $PROJECT_NAME , please wait ..."
    
       kill $pid
       
       if [ $log_pid ] ; then
    
           kill $log_pid
       
       fi
       
       echo "stop the $PROJECT_NAME successfully"
    
    else 
      
       echo "$PROJECT_NAME is already stopped"
    
    fi
       
    
    
    后台jar目录

    补充

    window nginx

    启动,直接执行 nginx.exe,或者在 git bash 窗口,执行 nginx.exe,然后,浏览器直接访问 http://localhost/

    启动 成功

    代理缓存:

    proxy_cache_path cache levels=1:2 keys_zone=my_cache:10m
    
    server {
      listen  80;
      server_name test.com;
    
      location / {
        proxy_cache my_cache;
        proxy_pass http://127.0.0.1:8888;
        proxy_set_header Host $host;
      }
    }
    
    

    说明:
    1:nginx 的缓存是从磁盘读取的,速度相对比较慢,可以优化从内存读取;

    2:nginx 缓存的主要作用为,只要浏览器访问过一次之后,不同浏览器访问,都可以使用代理服务器的缓存;

    相关文章

      网友评论

          本文标题:nginx 简介

          本文链接:https://www.haomeiwen.com/subject/xlziyftx.html