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'];
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 #设置最多开起的子进程
十九、集群性能测试
nginx 的安装、优化、服务器集群的更多相关文章
- nginx+apache+php+mysql服务器集群搭建
由于需要搭建了一个基本的服务器集群.具体的配置方案先不说了,到有时间的时候再介绍.下面介绍下整 个方案的优点. 我总共准备了四台阿里云的主机,架设分别是A,B1,B2,C,A在集群的最前面,B1和B2 ...
- nginx+tomcat+memcached搭建服务器集群及负载均衡
在实际项目中,由于用户的访问量很大的原因,往往需要同时开启多个服务器才能满足实际需求.但是同时开启多个服务又该怎么管理他们呢?怎样实现session共享呢?下面就来讲一讲如何使用tomcat+ngin ...
- 10分钟搭建服务器集群——Windows7系统中nginx与IIS服务器搭建集群实现负载均衡
分布式,集群,云计算机.大数据.负载均衡.高并发······当耳边响起这些词时,做为一个菜鸟程序猿无疑心中会激动一番(或许这是判断是否是一个标准阿猿的标准吧)! 首先自己从宏观把控一下,通过上网科普自 ...
- 搭建服务器集群——Windows7系统中nginx与IIS服务器搭建集群实现负载均衡
转载:https://www.cnblogs.com/xiongze520/p/10308720.html 分布式,集群,云计算机.大数据.负载均衡.高并发······当耳边响起这些词时,做为一个菜鸟 ...
- Nginx+Tomcat+Terracotta的Web服务器集群实做
1.准备工作两个Linux服务器,可以用VMware装一个,然后配置好再克隆一个,修改IP即可.Host1:192.168.0.79Host2:192.168.0.80先配置好jdk1.6.0和tom ...
- Nginx网络架构实战学习笔记(六):服务器集群搭建、集群性能测试
文章目录 服务器集群搭建 Nginx---->php-fpm之间的优化 302机器 202机器 压力测试 搭建memcached.mysql(数据准备) 今晚就动手-.- 集群性能测试 服务器集 ...
- Nginx详解-服务器集群
Nginx是什么 代理服务器:一般是指局域网内部的机器通过代理服务器发送请求到互联网上的服务器,代理服务器一般作用在客户端.应用比如:GoAgent,FQ神器. 一个完整的代理请求过程为:客户端首先 ...
- Hadoop集群安装-CDH5(3台服务器集群)
CDH5包下载:http://archive.cloudera.com/cdh5/ 主机规划: IP Host 部署模块 进程 192.168.107.82 Hadoop-NN-01 NameNode ...
- 10分钟学会windows中iis搭建服务器集群实现负载均衡和nginx代理转发
前言 我们之前聊过 10分钟搭建服务器集群--Windows7系统中nginx与IIS服务器搭建集群实现负载均衡:https://www.cnblogs.com/xiongze520/p/103087 ...
随机推荐
- Manacher(马拉车)————O(n)回文子串
Manacher 一.背景 1975年,Manacher发明了Manacher算法(中文名:马拉车算法),是一个可以在O(n)的复杂度中返回字符串s中最长回文子串长度的算法,十分巧妙. 让我们举个栗子 ...
- Mysql优化(出自官方文档) - 第一篇(SQL优化系列)
Mysql优化(出自官方文档) - 第一篇 目录 Mysql优化(出自官方文档) - 第一篇 1 WHERE Clause Optimization 2 Range Optimization Skip ...
- ASP.Net Core Configuration 理解与源码分析
Configuration 在ASP.NET Core开发过程中起着很重要的作用,这篇博客主要是理解configuration的来源,以及各种不同类型的configuration source是如何被 ...
- 8、基本数据类型(dict)
8.1.字典: 1.字典元素用大括号括起来,用逗号分割每个元素,字典元素是"key:value"的形式 dic = { "k1": 'v1', #键值对 &qu ...
- Linux + .net core 开发升讯威在线客服系统:同时支持 SQL Server 和 MySQL 的实现方法
前段时间我发表了一系列文章,开始介绍基于 .net core 的在线客服系统开发过程. 有很多朋友一直提出希望能够支持 MySQL 数据库,考虑到已经有朋友在用 SQL Server,我在升级的过程中 ...
- Mac nasm 汇编入门
下载 brew install nasm code SECTION .data msg: db "hello world", 0x0a len: equ $-msg SECTION ...
- JavaScript模块化的演变
自执行函数(IIFE): 作用:马上执行这个函数,自执行函数(IIFE),不易读 (function(x){console.log(x);})(3); 易读版本: (function(x){ retu ...
- php自动识别背景并且把它改为白色
此源码有个阈值可以自己调节,精确度等自测 <?php /*$Colorimg = new Colorimg(); $image=$Colorimg->IMGaction("G:/ ...
- 压力测试工具:apache bench(ab)
作为php后端工程师,除了实现业务需求之外,需要考虑的就是自己写的服务,在大并发下是否能正常运行了,例如在我之前文章讲到的,在并发下,数据库查询可能会造成脏读幻读等情况,导致业务不正常. 但是,在一般 ...
- 『心善渊』Selenium3.0基础 — 29、使用HTMLTestRunner生成unittest的HTML报告
目录 1.HTMLTestRunner介绍 2.HTMLTestRunner的使用 3.测试报告示例 4.封装成模块 1.HTMLTestRunner介绍 HTMLTestRunner是一个基于uni ...