nginx 的安装、优化、服务器集群

一、安装

下载地址:http://nginx.org  找到 stable 稳定版

安装准备:nginx 依赖于pcre(正则)库,如果没有安装pcre先安装

yum install pcre pcre-devel            -》安装pcre及pcre-devel

cd/usr/local/src/

wget hppt://nginx.org/download/nginx-1.4.2.tar.gz      -》下载nginx包

tar zxvf nginx--1.4.2.tar.gz                    -》解压包

cd nginx--1.4.2.tar.gz                    

./configure --prefix=/usr/local/nginx    -》意思是将该软件安装在 /usr/local/nginx 下面,利用configure产生Makefile

make && make install     -》编译且安装

启动:

cd/usr/local/nginx ,查看有如下四个目录

      ....conf 配置文件

      ....html  网页文件

     ....logs 日志问加你

     ....sbin  主要二进制程序

netstat -ant        -》查看80端口是否被占用,把80端口的程序先关闭(kill -9 进程数),才能正常启动nginx

./sbin/nginx  -》启动nginx

二、信号量

 kill -信号量 程序号

     -INT   -》快速杀死进程

    -QUIT  -》优雅关闭进程,即等请求结束后关闭

    -HUP  -》如果修改了配置文件,无须重启,旧得杀死,平滑用新的子进程 (nginx分为一个主进程,多个子进程)

     -USR1   -》重读日志,在日志分割时有用

     -USR2   -》平滑的升级

     -WINCH  -》优雅的关闭旧得进程,配合USR2来进行nginx的升级

如果不想总是查看进程号,可以使用pid文件 :kill -HUP 'cat logs/nginx.pid'

三、虚拟主机配置

nginx配置段

//全局区

worker_processes 1;     -》有一个工作的子进程,可以进行修改,太大无益,因为要争夺cpu,一般设置为cpu数*核数(4块cpu,每块8核,最多设置32进程)

Event{

//一般是配置nginx连接的特性,如1个word能同时允许多少连接

worker_connections 1024;      //指一个子进程最大允许连1024个连接

}

http{    //这是配置http服务器的主要段

  Server1{   //这是虚拟主机段

    Location{   //定位,把特殊的路径或文件再次定位,如image目录单独处理

    }                  //如  .php  单独处理

  }

  Server2{

  }

}

四、nginx 日志管理

我们观察nginx的server段,可以看到如下类似信息

#access_log     logs/host.access.log    main;

这说明 该server ,它的访问日志的文件是 logs/host.access.log,使用格式是main格式,除了main 还可以定义其它格式

远程IP、 远程用户/时间、 请求方法(get、post) 、请求body长度 、referer来源信息

http-user-agent 用户代理/蜘蛛被转发的请求原始ip

http_x_forwarded_for 在经过代理时,代理把你本来的ip加在此头信息中,传输你的原始ip

nginx允许针对不同的server做不同的Log

  Server1{   //这是虚拟主机段

    Location{   //定位,把特殊的路径或文件再次定位,如image目录单独处理

    }                  //如  .php  单独处理

    access_log logs/z.com.access.log main    //日志的配置

  }

五、nginx定时任务完成日志切割

-----shell 脚本文件runlog.sh start-------

#!/bin/sh

LOGPATH=/usr/local/nginx/logs/z.com.access.log

BASEPATH=/data/$(date -d yesterday +%Y%m)

bak=$BASEPATH/$(date -d yesterday +%d%H%m).zcom.access.log

mkdir -p $BASEPATH/$(date -d yesterday +%Y%m)

mv $LOGPATH $bak

touch $LOGPATH

kill -USR1 'cat /usr/local/nginx/logs/nginx.pid'

-----shell 脚本 end------

--------定时器 start------

crontab -e

*/1 * * * * sh /data/runlog.sh      (分时日月周)

--------定时器 end------

六、Location详解之精准匹配/一般匹配/正则匹配

location有定位的意思,根据 uri 来进行不同的定位。在虚拟主机的配置中,是必不可少的,咯擦同年可以把网站的不同部分,定位到不同的处理方式上。

比如碰到 .php  ,如何调用PHP 解释器? 这时就需要location

location 语法

location [=|~|~*|^~] patt {

}

中括号可以不写任何参数,此时称为一般匹配;也可以写参数,因此,大类型可以分为3中

location = patt {} [精准匹配]

location patt {} [一般匹配]

location ~ patt {} [正则匹配]

优先级   :精准匹配 >正则匹配> 一般匹配

七、rewrite 重写

if条件判断

set #设置变量

return #返回状态码

break #跳出rewrite

rewrite #重写

if 空格(条件){

  重写模式

}

条件的写法

1、“=”  判断相等,用于字符串比较

2、“~”  用正则来匹配(此处正则区分大小写)

  ~*  不区分大小写的正则

3、-f -d -e  来判断是否为文件,为目录,是否存在

eg. 

location / {

  if($http_user_agent ~ msie){

    rewrite ^.*$  /ie.html;

    break;   //避免无线重定向,否则会循环重定向

  }

  root  html;

  index  index.html  index.htm;

}

注意:用url重写时,正则里如果有“{}” ,正则要用双引号包起来!

八、编译PHP与nginx整合

apache 一般是把php当做自己的一个模块来启动的,而nginx则是把http请求变量(如get,user_agent等)转发给PHP进程,即PHP独立进程,与nginx进行通信,称为fastcgi运行方式

因此,为apache所编译的php是不能用于nginx的

编译:

./configure --prefix=/usr/local/fastphp

--with-mysql=mysqlnd         使其支持mysqlnd

--enable-mysqlnd

--with-gd                              使其支持gd库

--enable-gd-native-ttf

--enable-gd-jis-conv

--enable-fpm                        php编译成fpm形式 (nginx 的时候使用,PHP作为单独进程)

--prefix=/usr/local/php --with-apxs2=/usr/local/httpd/bin/apxs   (apache 时候使用 PHP作为apache的模块)

nginx+php 的配置比较简单,核心就是--把请求的信息转发给9000端口的PHP进程,让PHP进程处理指定目录下的PHP文件

location ~ .php${

  root html;

  fastcgi_pass 127.0.0.1:9000;

  fastcgi_index index.php;

  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

  include   fastcgi_params;

}

1、碰到PHP文件,

2、把根目录定位到html,

3、把请求上下文交给900进程端口PHP进程,

4、并告诉PHP进程,当前的脚本是 $document_root$fastcgi_scriptname

(注:PHP会去找这个脚本并处理,所以脚本的位置要指对)

九、nginx gzip压缩提升网站速度

原理:

浏览器--》请求--》声明可以接受gzip压缩 或 deflate 压缩 或 compress 或 sdch 压缩

从http协议的角度看--请求头 声明 acceopt-encoding:gzip deflate sdch (是指压缩算法,其中sdch是google倡导的一种压缩方式,目前支持的服务器不多)

服务器--》回应--把内容用gzip方式压缩---》发给浏览器

浏览器---解码gzip----接受gzip压缩内容---

gzip 的常用参数

gzip on|off       #是否开启gzip

gzip_buffers 4K|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资源的。

十、expires 缓存提升网站负载

 nginx的缓存设置 提高网站性能

对于网站的图片,尤其是新闻网站,图片一旦发布,改动的可能是非常小的,所以能否在用户访问一次后,图片缓存在用户的浏览器端。

可以,用到 nginx 的 expires 设置。nginx 中设置过期时间,非常简单

在 location 或 if 段里,来写

格式  expires 30s;

    expires 30m;

    expires 2h;

    expires 30d;

图片缓存:

  location ~* .(jpg|jpeg|gif|png){           #不区分大小写判断图片格式文件,进行缓存

    root hrml;

    expires 1d;

  }

注意:服务器的日期得准确;304也是一种很好的缓存手段:原理是服务器响应文件内容时,同时响应etag标签(内容的签名,内容一变,它也改变)和last_modified_since 两个标签值。浏览器下次去请求时,头信息发送这两个标签,服务器检测文件有无发生变化,如无,直接头信息返回 etag ,last_modified_since

浏览器知道内容无改变,于是直接调用本地缓存,这个过程也请求了服务器,但是传输的内容极少。对于变化周期较短的,如 静态html, js,css 比较适于这种方式

十一、返现代理 nginx + apache 动静分离

 nginx 反向代理服务器+负载均衡,非常简单,支持两个用法:proxy , upstream 分别用来做反向代理和负载均衡。

以反向代理为例,nginx 不自己处理 PHP 的相关请求,而是把 PHP 的相关请求转发给apache 来处理。

----->客户端---->nginx (.html)--------> proxy_pass ----------> apache (php)

   <---------------|<------------------------------------------------------|

动静分离不是一个严谨的说法,叫反向代理比较规范。

nginx 配置:

location ~ .php$ {

  proxy_pass http://192.168.1.200:800     #遇到php文件交给apache 去处理

}

十二、nginx 实现负载均衡

反向代理后端如果有多台服务器,自然可形成负载均衡,但 proxy_pass 如何指向多台服务器呢?

把多台服务器用 upstream 指定绑定在一起并起个组名,然后 proxy_pass 指向该组。

nginx 配置:

upstream imgserver{    //#建一个上游服务器,起名叫 imgserver

  #weight :权重(权重越高,对这台服务器请求越多) max_fails:几次请求连不上算失败 fail_timeout: 请求超时时间

  server  192.168.1.200:81 weight=1 max_fails=2 fail_timeout; 

  server  192.168.1.200:82 weight=1 max_fails=2 fail_timeout; 

}

server {                       //配置两个虚拟服务器

  listen 81;

  server_name localhost;

  root html;

}

server {

  listen 82;

  server_name localhost;

  root html;

}

location ~* .(jpg|jpeg|gif|pnd)$ {

  proxy_pass http://imgserver;     #遇到图片的请求将会传给imgserver

}

默认的负载均衡的算法很简单,就是针对后端服务器的顺序逐个请求。也有其它算法,如 一致性哈希,需要安装第三方模块(ngx_http_upstream_consistent_hash)。

反向代理导致了后端服务器ip,为前端服务器的ip,而不是客户真正的ip,怎么办?

答:代理服务器有自己的ip ,为了不丢失客户端的ip,得把客户端的ip放在变量里带过去,一般放在 X-Forwarded-For

location ~* .(jpg|jpeg|gif|pnd)$ {

  proxy_set_header X-Forwarded-For $remote_addr;   #把客户端的ip放在变量里带过去

  proxy_pass http://imgserver;    

}

十三、nginx 连接 memcached

nginx-------->memcached ,如果m中有数据 则直接返回nginx,如果没有则去PHP,PHP再给m,以后nginx再找m就有数据了

1、nginx要设定一个 key ,去查 m ; 2、如果没有查到,要有一个回调PHP 并把 key 传给PHP。

nginx 配置:

location / {

  set $memcached_key "$uri";     #遇到图片的请求将会传给imgserver

  memcached_pass 127.0.0.1:11211;

  error_page 404 /callback.php;

}

php :

$uri = $_SERVER['REQUEST_RUI'];

十四、第3方模块编译及一致性哈希应用

nginx hash($uri)---> 某台mc

php  hash($uri)----->同一台mc

十五、大访问量优化整体思路

 高性能的服务器架设,网站的请求量是绝对的,很难降下来。

请求量大,如何支撑?

1、方面,要减少请求,对于开发人员,合并css,背景图片,减少MySQL查询等。

2、nginx 的 expire,利用浏览器缓存等,减少查询。

3、利用 cdn 来响应请求。

4、最终剩下的,不可避免的请求,利用 服务器集群+负载均衡 来支撑。

既然最后的响应是不可避免的,我们要做的是把工作内容“平均”分给每台服务器。最理想的状态,每台服务器的性能都被充分利用。

十六、ab压力测试及nginx性能统计模块

书接上文

nginx 安装统计模块,便于观察 nginx 的状态

./configure --prefix=/usr/local/nginx/  --add-module=/app/ngx_http_consistent_hash-master --with-http_stub_status_module

location /status{

  stub_status on;

  access_log off;          #统计模块 就不开日志了

  allow 192.168.1.100;   #一般人不允许观看,设置观看者的ip

  deny all;

}

十七、nginx 单机1W并发优化

优化思路:

nginx响应请求

1、建立socket 连接

2、打开文件,并沿 socket 返回。

排查问题,也要注意观察这两点:主要从系统的 dmesg 和 nginx 的 error_log 来观察

ulimit -n 20000  #将socket连接调高(服务器可以打开多少个文件)

1、修改nginx 配置文件

events{

  worker_connections 10240;

}

2、socket的优化(系统层面)  : echo 50000 >/proc/sys/net/core/somaxconn  

3、快速回收设置 : echo 1> /proc/sys/net/ipv4/tcp_tw_recycle                         #1开起快速回收,0关闭

4、空的tcp允许回收利用 :  echo 1> /proc/sys/net/ipv4/tcp_tw_reuse

5、不做洪水抵御:echo 0> /proc/sys/net/ipv4/tcp_syncookies                      #0不做洪水抵御

1、ulimit -n 500000

2、nginx 配置文件:worker_rlimit_nofile 10000            #一个工作进程,允许打开多少个文件

十八、服务器集群搭建

 1、php-fm 是个单独的进程,每有一个请求就会建立一个子进程,子进程使用完毕就会回收,但是高并发情况下,设置其不回收,一直响应请求

pm.max_children = 16        #设置最多开起的子进程

十九、集群性能测试

原文地址:https://www.cnblogs.com/isungge/p/10896617.html