快速上手Nginx

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

名词解释

  • CGI: 是 Web Server 与 Web Application 之间数据交换的一种协议(规定Nginx接收哪些数据,以什么样的数据格式传给应用程序(PHP、Python、JAVA等) 。每一次web请求CGI都会 fork 新的子进程,处理完毕后再销毁,大量的fork操作造成CGI的性能较差
  • CGI程序 / php-cgi: PHP解析器
  • FastCGI: CGI的升级版,特点是采用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通过CGI协议将请求分发给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. 对客户端访问进行管理(代理服务器可做管理服务器,所有需要上网的客户端都必须通过代理服务器)


      快速上手Nginx_第1张图片
      正向代理

反向代理:

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

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

  • 作用:

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


      快速上手Nginx_第2张图片
      反向代理
  • Q: 为什么感觉正向代理和反向代理的定义看上去差不多(都是 client -> proxy -> server)呀?
    A: 两个代理确实都是 client -> proxy -> server 这样一个过程,但是正向代理,client和proxy是一伙的,proxy帮助client隐藏身份,好去攻打server。而反向代理,proxy和server是一伙的,proxy帮助server隐藏身份,由proxy去对外抵御攻击。
    快速上手Nginx_第3张图片
    区别(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 - 博客园

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

你可能感兴趣的:(快速上手Nginx)