快速上手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. 对客户端访问进行管理(代理服务器可做管理服务器,所有需要上网的客户端都必须通过代理服务器)


      正向代理

反向代理:

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

  • 通俗定义: 你(客户端)又欠费停机了,拨打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 - 博客园

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容

  • 上一篇《WEB请求处理一:浏览器请求发起处理》,我们讲述了浏览器端请求发起过程,通过DNS域名解析服务器IP,并建...
    七寸知架构阅读 80,909评论 21 356
  • Nginx简介 解决基于进程模型产生的C10K问题,请求时即使无状态连接如web服务都无法达到并发响应量级一万的现...
    魏镇坪阅读 1,984评论 0 9
  • 第一章 Nginx简介 Nginx是什么 没有听过Nginx?那么一定听过它的“同行”Apache吧!Ngi...
    JokerW阅读 32,633评论 24 1,002
  • 1.ngnix介绍 ngnix www服务软件 俄罗斯人开发 开源 性能很高 本身是一款静态WWW软件 静态小文件...
    逗比punk阅读 2,075评论 1 6
  • 1. Nginx的模块与工作原理 Nginx由内核和模块组成,其中,内核的设计非常微小和简洁,完成的工作也非常简单...
    rosekissyou阅读 10,180评论 5 124