Nginx与服务器集群
服务器介绍
1、概念(通俗理解)
服务器:就是没有显示器的电脑(比普通电脑配置高,并且有一个唯一的公网ip)
web服务器:就是一个软件(一般监听80端口,用户接口用户请求,响应请求给用户)
2、常用Web服务器
- Apache
1)是世界上用的最多的Web服务器,它的优势在开源代码开放,功能完善,历史悠久,模块支持非常丰富,跨平台;缺点在于比其他web服务器内存占用高;
2)适用于动态网站。
- Nginx
1)是一款轻量级的Web 服务器/反向代理服务器及电子邮件代理服务器,其特点是占有内存少,并发能力强,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等;
2)适用于反向代理服务器和静态资源服务器(注:线上公司都使用Linux安装)
- IIS:
是windows系统上的服务器产品(微软公司提供)。主要是给.net和asp语言使用的,经过扩展也是可以支持PHP语言(不推荐使用)。
- Lighttpd:(图片服务器)
是一个德国人领导的开源Web服务器软件,具有非常低的内存开销、cpu占用率低、效能好以及丰富的模块等特点。
web服务器市场使用排行:https://w3techs.com/
http://www.lvse.com/site/w3techs-com-83.html
3、静态资源服务器
- 场景:
传统的web项目,一般都将静态资源存放在项目Public的目录下,这样做很方便获取静态资源,但是如果说web项目很大,用户很多,静态资源也很多时,服务器的性能明显下降。这种情况下一般都会需要一个静态资源的服务器。
- 实现:通过nginx搭建,或者通过阿里云、七牛的对象存储
- 大型项目分离好处(注:推荐静态资源使用新域名):
1、便于维护使用(举例:一个项目图片可以方便所有项目使用,如:jq等)
2、动静分离有利于CDN加速 (注:动静分离指后端处理数据文件和静态文件分离)
3、【新域名好处】便于缓存 (举例:请求的是同一文件,就不用再下载了)
4、【新域名好处】静态资源的http请求中不会携带无用的cookie。
5、【新域名好处】优化浏览器对同一域名进行请求的最大并发连接数限制(注:不同浏览器限制不同)
什么是静态资源服务器:就是单独存放静态资源资源的服务器(如:css、js、图片等)
如何搭建静态资源服务器:通过nginx
好处:比传统快
CDN服务器
- 作用:大型项目加速网站访问速度
- 说明:CDN服务器供应商在全国各个城市都有一个机房,用于后期缓存静态资源,
网站老板购买了CDN后,其网站用户访问时第一次去源服务器访问并缓存到用户最近的机房,下次直接去最近的机房(节点)访问。
5、大型项目架构
集群技术/冗余技术:将多台服务器集中在一起,实现同一业务。
负载均衡技术:将任务按照指定策略分布到集群环境中的服务器上。
主从复制:一主或多主一从或多从,当主服务器insert/update/delete动作,从服务器自动同步。
动静分离:动态资源和后端程序在不同的服务器上
读写分离:增/删/改在操作一台数据库,读操作另一个数据库
二、Nginx服务器
1、Nginx概述
Nginx是一款轻量级、高性能的Web 服务器或反向代理服务器或邮件服务器,因它的稳定性、丰富的功能集和低系统资源的消耗而闻名。
Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求添
加了很多高级功能和特性。成功案例:淘宝网,天猫商城等。
官网:http://tengine.taobao.org/faq_cn.html
Nginx特点
占有内存少,并发能力强
3、Apache与Nginx服务器区别
- Nginx相对 Apache的优点
轻量级,同样起web 服务,比apache 占用更少的内存及资源;
抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能
高度模块化的设计,编写模块相对简单;
社区活跃,各种高性能模块出品迅速;
- Apache相对Nginx的优点
rewrite ,比nginx 的rewrite 强大;
模块超多,基本想到的都可以找到;
少bug ,nginx 的bug 相对较多;
超稳定;
- 总结
Nginx – 静态资源服务器或反向代理服务器使用(对象存储代替)
Apache – 后端服务器
三、LNMP的安装与配置
1、Nginx的安装
1)依赖注意
模块依赖性:Nginx的一些模块需要其他第三方库的支持,例如gzip模块需要zlib 库,rewrite模块需要pcre库,ssl功能需要openssl库等。
pcre安装
shell> cd /php/tools
shell> tar -zxvf pcre-8.34.tar.gz #解压
shell> cd pcre-8.34 #进入解压目录
shell> ./configure && make && make install #配置、编译和安装
3)zlib压缩库
shell> cd /php/tools
shell> tar -zxvf zlib-1.2.5.tar.gz
shell> cd zlib-1.2.5
shell> ./configure # 这个配置编译命令不要加目录参数
shell> make && make install
4)Nginx安装
shell> cd /php/tools
shell> tar -zxvf nginx-1.8.1.tar.gz
shell> cd nginx-1.8.1
shell> mkdir -p /php/server/nginx
shell> ./configure –prefix=/php/server/nginx
shell> make && make install
2、管理Nginx
1)启动Nginx
shell> /php/server/nginx/sbin/nginx
通过浏览器查询是否启动成功,出现如下内容,则启动成功。
Nginx服务器默认80端口
需要关闭Linux服务器防火墙或者添加80端口例外(service iptables stop)
︴如果启动Nginx报错:libpcre.so.1: cannot
解决:
shell> ln -s /lib/libpcre.so.0.0.1 /lib/libpcre.so.1 (再重新启动nginx即可)
2)关闭Nginx服务
shell> /php/server/nginx/sbin/nginx -s stop
重启服务
shell> /php/server/nginx/sbin/nginx -s reload
3、配置文件(nginx.conf)
1)位置
2)说明
user 用户 用户组;
#有1个工作子进程,可以自行修改,一般为当前机器总cpu核心数的1到2倍
worker_processes 8;
events {
#单个后台worker process进程的最大并发链接数
#最大连接数 = worker_processes * worker_connections
worker_connections 1024; #这里指一个子进程最大允许连接1024
}
http { #这是配置http服务器的主要段
server { #虚拟主机段
location { #定位,把特殊的文件再次定位,如image目录单独处理或php单独处理
}
}
server { #虚拟主机段
location { #定位,把特殊的文件再次定位,如image目录单独处理或php单独处理
}
}
…….
}
每新增一个server则添加一个虚拟主机(推荐:使用include方式引入外部虚拟主机配置文件)
4、配置虚拟主机(Nginx)
1)概念(无需操作)
在nginx下配置虚拟主机非常简单,只需在nginx下http {} 中 增加一个server(填入如下配置)即可新增一个虚拟主机
server {
# 监听端口
listen 80;
# 绑定域名(多个之间用空格隔开)
server_name 待绑定的域名;
location / {
# 项目根目录
root /php/wwwroot/web1;
# 默认首页
index index.html index.htm;
}
}
主配置(nginx.conf)文件新增2个虚拟主机
- 步骤1:打开Nginx主配置文件(nginx.conf)引入外部虚拟主机配置文件
shell> vi /php/server/nginx/conf/nginx.conf
在http{}中加入下属代码:
server {
# 监听端口
listen 80;
# 绑定域名(多个之间用空格隔开)
server_name n1.com;
location / {
# 项目根目录
root /php/wwwroot/web1;
# 默认首页
index index.html index.htm;
}
}
server {
# 监听端口
listen 80;
# 绑定域名(多个之间用空格隔开)
server_name n2.com;
location / {
# 项目根目录
root /php/wwwroot/web2;
# 默认首页
index index.html index.htm;
}
}
修改nginx.conf主配置文件强烈推荐先备份,如:cp -r nginx.conf nginx.conf.bak
- 步骤2:创建虚拟主机目录
shell> mkdir -p /php/wwwroot/web1 /php/wwwroot/web2
shell> echo ‘this is n1.com’ > /php/wwwroot/web1/index.html
shell> echo ‘this is n2.com’ > /php/wwwroot/web2/index.html
- 步骤3:重启服务即可
shell> /php/server/nginx/sbin/nginx -s reload
- 步骤4:在本机修改hosts文件
流程:当打开本机浏览器输入n1.com或者n2.com会访问对用的IP的Linux服务器的80端口软件Nginx会让其访问对应的web项目。
注:后期需要增加虚拟主机,则继续上述步骤添加server即可
︴扩展:引入外部配置文件(同apache开启httpd-vhosts)
- 说明:在主配置文件中新增多个虚拟主机,导致配置文件越来越大,不便于管理,
所以建议采取下述方案:一个虚拟主机对应一个配置文件。
- 步骤1:打开Nginx主配置文件(nginx.conf)将刚新增的两个虚拟主机删除或注释
- 步骤2:打开Nginx主配置文件(nginx.conf)引入外部虚拟主机配置文件
shell> vi /php/server/nginx/conf/nginx.conf
在http{}中加入:【include vhosts/*.conf;】
- 步骤3:新建外部虚拟主机目录(vhosts)
shell> mkdir -p /php/server/nginx/conf/vhosts #用于存放虚拟主机文件(一个文件对应一个虚拟主机)
- 步骤4:新建新建虚拟主机
shell> cd /php/server/nginx/conf/vhosts
shell> vi nginx1.conf
server {
# 监听端口
listen 80;
# 绑定域名(多个之间用空格隔开)
server_name n1.com;
location / {
# 项目根目录
root /php/wwwroot/web1;
# 默认首页
index index.html index.htm;
}
}
- 步骤4:重启服务即可
shell> /php/server/nginx/sbin/nginx -s reload
注:后期需要增加虚拟主机,则在【/php/server/nginx/conf/vhosts】目录下新建【xxx.conf】以conf
结尾的文件然后填写server即可。
5. 安装php并与nginx整合(php-fpm)
1)说明
php安装可以作为Apache模块存在,同时也可以单独的作为一个服务运行(端口是9000端口),这种单独运行的模式叫做php-fpm模式,在5.3.3+以后的版本都默认支持,以前的版本需要打补丁。
2)安装libxml2(否则配置php报错)
shell> cd /php/tools
shell> tar zxvf libxml2-2.7.2.tar.gz
shell> cd libxml2-2.7.2
shell> ./configure
shell> make && make install
3)安装PHP
shell> cd /php/tools
shell> tar -zxvf php-5.6.31.tar.gz
shell> cd php-5.6.31
shell> ./configure –prefix=/php/server/php –enable-fpm
注意:–enable-fpm该选项是指,以独立进程的方式来安装PHP。
shell> make && make install
复制php.ini配置文件到指定目
shell> \cp php.ini-development /php/server/php/lib/php.ini
php.ini 在php源代码解压文件目录里
4)管理PHP服务
shell> /php/server/php/sbin/php-fpm # 启动服务
shell> killall php-fpm # 关闭服务
︴启动服务报错:
ERROR: failed to open configuration file ‘/xxxx/php/etc/php-fpm.conf
cp \
/php/server/php/etc/php-fpm.conf.default \
/php/server/php/etc/php-fpm.conf
注:注意修改红色PHP安装路径
查看是否启动成功
5)让nginx支持PHP
步骤1:虚拟主机添加
location ~ \.php$ {
root 虚拟主机路径;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME 虚拟主机路径/$fastcgi_script_name;
include fastcgi_params;
}
步骤2:重启nginx即可
shell> /php/server/nginx/sbin/nginx -s reload
四、配置expires缓存功能
1、expires缓存功能概述
- 作用:设置expires减少不必要的http请求
- 场景:将静态资源(css、js、图片)等缓存到客户端,减轻服务区压力
浏览器默认也有缓存机制,通过expires统一缓存时间
校验文件缓存是否过期 Expires(http1.0)、Cache-Control:max-age=秒(http1.1)
协议中Etag头信息校验 Etag (请求:If-None-Match)
Last-Modified头信息校验 Last-Modified (请求:If-Modified-Since)
2、详细配置
对nginx 来说,实现的方法很简单,只要在location段中,使用 expires 就可以了
格式。
步骤1:打开虚拟主机配置
location ~ \.(gif|jpg|jpeg|png|bmp|ico)$ {
root /php/wwwroot/web1;
expires 1d; #1d (天) 1h(时) 1m(分) 1s(秒)
}
步骤2:重启nginx
案例
谷歌浏览器不出现:from cache可能是系统时间导致
验证:
date命令 – 查看系统时间
步骤:
date -s ‘日期’ – 修改系统时间(注:执行该命令后必须clock -w 写入到系统中)
总结
expires作用:减少不必要的http请求
问:部分浏览器默认支持expires功能,为甚还需要自己设置?
答:自定义过期时间
问:如何验证expires是否设置成功?
答:看network的响应头信息 cache-control
五、开启gzip压缩
1、开启gzip的好处
gzip开启以后会将输出到用户浏览器的数据进行压缩的处理,这样就会减小通过网络传输的数据量,提高浏览的速度。(以空间换时间,以时间换空间)
配置
步骤1:打开虚拟主机配置文件
gzip on; #开启Gzip压缩
gzip_min_length 1k; #不压缩临界值,大于1K的才压缩
gzip_comp_level 6; #压缩级别(1-9)越大越慢,同时也最消耗CPU
#声明压缩文件(MIME类型)
gzip_types text/plain application/x-javascript text/css application/xml text/javascript image/jpeg;
gzip_disable “MSIE [1-6]\.”; #禁用IE1-6
步骤2:重启nginx
—————————————————-
开启成功标识
压缩前
压缩后
负载均衡配置
1、负载均衡图
2、nginx支持的三种负载均衡策略
轮询:将请求依次轮询发给每个服务器。
最少链接:将请求发送给持有最少活动链接的服务器。
ip哈希:通过哈希函数决定请求发送给哪个服务器。
权重:服务器的权重越高,处理请求的概率越大。
3、轮询负载均衡
http {
#设定负载均衡的服务器列表 phpServers 可以写网址或ip或其他英文
upstream phpServers {
server 服务器IP:端口;
server 服务器IP:端口;
server 服务器IP:端口;
}
server {
listen 80;
location / {
# 当80端口有请求的时候交给上面定义的负载均衡器处理(phpServers )
proxy_pass http://phpServers ;
}
}
}
4、最少链接负载均衡
http {
upstream CashServers {
least_conn;
server 服务器IP:端口;
server 服务器IP:端口;
server 服务器IP:端口;
}
server {
listen 80;
location / {
proxy_pass http://CashServers;
}
}
}
最少链接负载均衡通过least_conn指令定义;
此负载均衡策略适合请求处理时间长短不一造成服务器过载的情况;
5、ip哈希负载均衡
http {
upstream CashServers {
ip_hash;
server 服务器IP:端口;
server 服务器IP:端口;
server 服务器IP:端口;
}
server {
listen 80;
location / {
proxy_pass http://CashServers;
}
}
}
ip哈希负载均衡使用ip_hash指令定义;
nginx使用请求客户端的ip地址进行哈希计算,确保使用同一个服务器响应请求;
此策略适合有状态服务,比如session;
6、权重
http {
upstream CashServers {
可以加最少连接负载均衡参数
或者加ip哈希负载均衡参数
server 服务器IP:端口 weight=3;
server 服务器IP:端口 weight=2;
server 服务器IP:端口 weight=1;
}
server {
listen 80;
location / {
proxy_pass http://CashServers;
}
}
}
权重负载均衡需要使用weight指令定义;
权重越高分配到需要处理的请求越多;
此策略可以与最少链接负载和ip哈希策略结合使用;
此策略比较适合服务器的硬件配置差别比较大的情况;
七、动静分离
步骤1:打开负载均衡服务器主配置文件(vi /php/server/nginx/conf/nginx.conf)
步骤2:重启nginx即可
八、SESSION共享
1、说明
明确:session存储在服务端
发现:由于实现了负载均衡导致,如果是轮询策略导致session丢失
解决
- 使用ip哈希负载均衡策略
- session入库(将session保存到数据库中)
如果有a网站和b网站,希望a网站登录成功后b网站自动登录(注:登录肯定用session存储)
答:大公司解决方法,修改session存储方式数据库(memcache)
扩展
- 一键安装包网站:http://lnmp.org/
- 淘宝的tengine:http://tengine.taobao.org/
- 中文站点:http://www.nginx.cn/doc/