快速上手Nginx

作者: Lee_DH | 来源:发表于2017-11-25 18:32 被阅读130次

    Nginx是一个高性能的HTTP和反向代理器,具有占内存少,并发能力强的特点。市面上关于Nginx的博客和书籍非常多,本文只是帮助读者快速上手Nginx,篇幅有限,很难做到面面俱到,望各位见谅。

    名词解释

    • CGI: 一种数据传输协议,规定Nginx传哪些数据,以什么样的数据格式传给应用程序(PHP、Python、JAVA等)
    • CGI程序 / php-cgi: PHP解析器
    • FastCGI: CGI的升级版,一种用来程序(如PHP,Python、Java)和Web服务器通信的协议,特点是采用master-worker进程管理模式,提升PHP解析器的性能和效率
    • PHP-FPM(PHP FastCGI Process Manager): 针对PHP的FastCGI的一种实现,它负责管理一个进程池,处理来自web服务器的请求,内置于PHP,支持平滑重载PHP配置

    Nginx与PHP通信过程

    我们都知道,PHP作为脚本语言,是需要解析器解释执行的,一般用 php解析器(/usr/bin/php) 执行php文件,但是用户要访问php文件,怎么合理去安排php解析器(/usr/bin/php)有序、高效执行php文件呢,这就是Nginx的作用了,它可以看做是客户端与PHP解析器的中间媒介,合理调度PHP解析器去解析PHP程序。

    一般的交互过程是:客户端向服务器请求一个非静态资源(如PHP文件,非html文件、图片等),Nginx将请求分发给PHP-FPM进程,由PHP-FPM转发给PHP解析器,PHP解析完成之后,将解析的内容交由PHP-FPM,返回给客户端

    nginx操作

    nginx采用的是master-worker多线程模式,所以在操作nginx时,只需要与nginx的master进程通信即可,nginx0.8之后可以采用命令行参数进行nginx的操作

    启动nginx:nginx -c nginx.conf
    平滑重启nginx:kill -HUP 主进程号
    重启nginx: nginx -s reload
    从容停止nginx: kill -QUIT 主进程号
    快速停止nginx:1. nginx -s stop 2. kill -TERM 主进程号

    Nginx配置

    Nginx配置文件主要分4部分

    • main(全局设置): main部分的指令将影响其他所有的设置
    • server(主机设置): server部分的指令主要作用于指定的主机和端口
    • upstream(负载均衡服务器设置): upstream指令主要作用于负载均衡的设置
    • location(指定网页的设置): 主要用于匹配上的网页的设置

    Nginx配置文件demo

    #Nginx的worker进程运行用户以及用户组
    user  www www;
    
    #worker开启的进程数,一般设置为与cpu核数一致
    worker_processes auto;
    
    #定义错误日志,error_log级别 [debug|info|notice|warn|crit]
    error_log  /var/log/nginx/error.loh  info;
    
    #指定进程ID存储文件位置
    pid        /usr/local/nginx/logs/nginx.pid;
    
    #Specifies the value for maximum file descriptors that can be opened by this process.
    #单个进程最大的文件连接数
    worker_rlimit_nofile 51200;
    
    events
        {
            #选用的事件模型 [ kqueue | rtsig | epoll | /dev/poll | select | poll ]
            use epoll;
            #每个进程最大连接数
            worker_connections 51200;
            #串行工作方式(降低负载,当服务器吞吐量大时,使用并行工作方式)
            multi_accept on;
        }
    
    http
        {
            #文件扩展名与文件类型映射表
            include       mime.types;
            #指定文件类型为二进制流
            default_type  application/octet-stream;
    
            #服务器名字的hash表大小
            server_names_hash_bucket_size 128;
            #客户端请求头的header_buffer大小
            client_header_buffer_size 32k;
            #客户端请求头中较大的消息头的缓存最大数量和大小
            large_client_header_buffers 4 32k;
            #客户端请求单个文件的最大字节数
            client_max_body_size 50m;
    
            #开启高效传输模式
            sendfile   on;
            #防止网络阻塞
            tcp_nopush on;
            tcp_nodelay on;
            #客户端链接超时时间
            keepalive_timeout 60;
    
            #FastCGI相关参数,改善网站性能,减少资源占用
            fastcgi_connect_timeout 300;
            fastcgi_send_timeout 300;
            fastcgi_read_timeout 300;
            fastcgi_buffer_size 64k;
            fastcgi_buffers 4 64k;
            fastcgi_busy_buffers_size 128k;
            fastcgi_temp_file_write_size 256k;
    
            #gzip模块设置(服务器端压缩页面,传到浏览器后浏览器解压并解析,主流浏览器都支持解析gzip压缩过的页面)
            #开启gzip压缩
            gzip on;
            #最小压缩文件大小
            gzip_min_length  1k;
            #压缩缓冲区
            gzip_buffers     4 16k;
            #压缩版本
            gzip_http_version 1.1;
            #压缩等级1-9,等级越高,压缩效果越好,节约宽带,但CPU消耗大
            gzip_comp_level 2;
            #压缩类型
            gzip_types     text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss;
            #前端缓存服务器缓存经过压缩的页面
            gzip_vary on;
            #Nginx作为反向代理时启用,根据请求头中的Via字段,决定是否启用gzip压缩
            gzip_proxied   expired no-cache no-store private auth;
            gzip_disable   "MSIE [1-6]\.";
    
            #limit_conn_zone $binary_remote_addr zone=perip:10m;
            ##If enable limit_conn_zone,add "limit_conn perip 10;" to server section.
    
            #低版本的Nginx可能存在漏洞
            ## 隐藏Nginx的版本信息
            ![展示版本信息](http://39.108.219.103/nginx_version.png)
            ![隐藏版本信息](http://39.108.219.103/nginx_no_version.png)
            server_tokens off;
            #用户的访问日志
            access_log /var/log/nginx/access.log;
    
    server
        {
            #监听端口
            listen 80 ;
            #listen [::]:80 default_server ipv6only=on;
            #访问域名
            server_name localhost;
            #默认页面,优先展示:index.html > index.htm > index.php
            index index.html index.htm index.php;
            #指定虚拟主机的网页根目录
            root  /home/wwwroot;
    
            ###可以单独为此虚拟主机指定访问日志和错误日志的存放路径
            
            #自定义错误页面(注:后面的路径是相对地址,相对于虚拟主机的网页根目录)
            error_page   404   /404.html;
    
            # Deny access to PHP files in specific directory
            #location ~ /(wp-content|uploads|wp-includes|images)/.*\.php$ { deny all; }
    
            include enable-php.conf;
    
            #配置Nginx状态页
            location /nginx_status
            {
                stub_status on;
                access_log   off;
            }
    
            access_log  /home/wwwlogs/access.log;
        }
    include vhost/*.conf;
    }
    

    location配置规则

    匹配符号
    • = 精确匹配
    • ~ 区分大小写的匹配
    • ~* 不区分大小写的匹配
    • ^~ 以某个字符串开头进行匹配
    • / 通用匹配,如果没有其他匹配,任何请求都会匹配上
    匹配优先级

    location = > location 完整路径 > location ^~ 路径 > location ~ 、~* > location 部分起始路径 > /

    Rewrite规则

    • rewrite只能放在server{},location{},if{}中,并且只能对域名后边的除去传递的参数外的字符串起作用,例如 http://seanlook.com/a/we/index.php?id=1&u=str 只对/a/we/index.php重写。

    • location和rewrite都能实现跳转,主要区别是:location是对一类路径做控制访问或者反向代理,而rewrite是在同一域名内更改获取资源的路径(因为rewrite只能对域名后边的除去传递的参数外的字符串起作用)

    • flag标志位

      1.last: 完成rewrite之后,将新的url重新匹配server里面的location。(ps: 当flag标志位为空时,默认是 last)

      2.break: 完成rewrite之后,网页根目录如果存在指定文件或资源,则直接请求成功,返回200;如果请求内容不存在,则返回404

      3.permanent: 返回301永久重定向(地址栏会显示跳转后的地址)

      4.redirect: 返回302临时重定向(地址栏会显示跳转后的地)

      5.关于 last和break的区别: 可以把last当做编程语言中的continue,完成rewrite,不结束匹配,需要重新去匹配server中的location,break和编程语言中的break是一样的,rewrite完成之后,直接退出循环(location匹配),进行下一步操作

    Nginx做反向代理服务器

    正向代理:

    • 定义: 为了从原始服务器取得内容,客户端向代理服务器发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并获得内容返回给客户端。
    • 通俗定义: 你(客户端)正处于创业的关键阶段,现在急需500W就能使项目起死回生,你找到阿里巴巴的马先生(服务器)借钱,不用想,当然是碰一鼻子灰。巧的是,我(代理服务器)和马云非常熟络,所以你就通过我,去向马云借钱,最后把钱借到,你如愿成为高富帅,登上福不服,迎娶白富美。
    • 作用:
      1. 访问之前无法访问的资源 (如Google、向马云借钱)
      2. 服务器不知道访问的客户端(马云并不知道其实是你借的钱)
      3. 服务器返回的数据都是通过代理服务器分发给客户端,在分发之前,代理服务器都会在硬盘中保存一份,代理服务器可以做缓存,加速访问资源
      4. 对客户端访问进行管理(代理服务器可做管理服务器,所有需要上网的客户端都必须通过代理服务器)


        正向代理

    反向代理:

    • 定义: 客户端请求服务器的资源,服务器上其实是没有此资源的,所以它就从同局域网的兄弟服务器那,取了资源来返回给你,当成是自己的资源。

    • 通俗定义: 你(客户端)又欠费停机了,拨打10086的客服电话(反向代理服务器),你不管接电话的是MM还是GG,不管接电话的话务员(服务器)高矮胖瘦,反正都得给我解决问题,最后通过打电话得知,我的手机确实欠费了(得到的答复,就是请求的资源)。

    • 作用:

      1. 负载均衡,利用反向代理服务器,分发请求给不同的服务器,优化网站的负载
      2. 保证内网安全,反向代理服务器当成一个隔离防火墙,过滤web攻击
      3. 同正向代理,也有缓存的作用


        反向代理
    • Q: 为什么感觉正向代理和反向代理的定义看上去差不多(都是 client -> proxy -> server)呀?
      A: 两个代理确实都是 client -> proxy -> server 这样一个过程,但是正向代理,client和proxy是一伙的,proxy帮助client隐藏身份,好去攻打server。而反向代理,proxy和server是一伙的,proxy帮助server隐藏身份,由proxy去对外抵御攻击。
      区别(From 知乎大神)

    设置反向代理

    upstream www_koumm_com {   
       server 127.0.0.1:8000 down;
       server 127.0.0.1:7070 backup;
       server 192.168.129.22:8000 weight=5;   
       server 192.168.129.23:8000;
    }   
      
    server {   
       listen          80;   
       server_name     www.koumm.com;   
       access_log      logs/www.koumm.access.log main;   
       location / {   
           proxy_pass  http://www_koumm_com;
       }   
    } 
    

    上面的配置文件就实现了初步的负载均衡,所有的请求都会通过proxy_pass转发到后台的服务器,后台的服务器通过upstream建立。upstream结点中的服务器支持4种方式进行请求分配:

    • 1.轮询(默认)
      每个请求按照时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除
      1. weight
        指定轮询的权重,weight和访问成正比,用于后端服务器性能不均的情况
      1. ip_hash
        每个请求按访问ip的hash结果分配,确保每位访客固定访问一个后端服务器,可以解决session的问题
      1. fair(第三方)
        按后端服务器响应时间来分配请求,响应时间短的优先
    每个设备可以有5种不同的状态:
    1. down: 当前server不参与负载
    2. weight: weight越大,负载的权重就越大 
    3. max_fails: 允许请求失败的最大次数(默认为1)
    4. fail_timeout: max_fail失败之后,暂停的时间 
    5. backup: 定义备份机器,只有其他机器在忙或者down的时候,才会分发到backup机器
    
    相关博客:

    Nginx从听说到学会 - 简书
    nginx配置location总结及rewrite规则写法 - 官朝辉 - 博客园
    使用Nginx实现反向代理 - CSDN博客
    正向代理与反向代理【总结】 - Anker's Blog - 博客园
    反向代理为何叫反向代理? - 知乎
    nginx fastcgi配置 - lpfuture - 博客园

    如果这篇文章对你有帮助,请点个赞哈,感谢

    相关文章

      网友评论

      • faithfu:刚开始看Nginx,你的文章对我很有帮助,非常感谢

      本文标题:快速上手Nginx

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