几个基本概念PV值(page views):页面的浏览量UV值(unique visitor):独立访客独立IP:独立的IP访问量解决高并发思路如果一个网站的UV、PV,独立IP变大,则会导很高的并发
几个基本概念
- PV值(page views):页面的浏览量
- UV值(unique visitor):独立访客
- 独立IP:独立的IP访问量
解决高并发思路
如果一个网站的UV、PV,独立IP变大,则会导很高的并发,这时要对网站分层布局架构,采用负载均衡。
负载均衡
硬件:立竿见影,效果非常好,价格非常昂贵,比如F5-BIGIP
软件:lvs(linux virtual server) ,nginx(web服务器,负载均衡)
负载均衡实现策略
- 轮询, 负载均衡器把请求轮流转发给后面的web服务器。
- ip哈希, 同一个地址的客户端,始终请求同一台主机。
- 最少连接,负载均衡器把请求给负载最小的哪台服务器。
Nginx的介绍
常用web服务器
Apache:功能完善,历史悠久,模块支持非常丰富,属于重量级产品,比较耗费内存。缺点:处理每一个php比较费资源,导致如果高并发时会耗费服务器资源无法处理更多请求。
lighttpd:内存开销低,cpu占用率低,效能好,模块丰富等特点,轻量级web服务器。
Nginx:省资源,省cpu,所以在高并发时能够处理更多的请求,高端能达到3万到5万的并发量。
选择Nginx理由
- 它可以高并发连接,官方测试能够支撑5万并发连接,在实际生产环境中可以支撑2到4万并发连接。
- 内存消耗少 Nginx+php(FastCGI)服务器再3万并发连接下,开启的10个Nginx进程消耗150MB内存(15MB10=150MB)开启的64个php-cgi进程消耗1280MB内存(20MB64=1280MB)
- 成本低廉 购买F5 BIG-IP ,NetScaler等硬件负载均衡交换机需要10多万甚至几十万人民币。而Nginx为开源软件,可以免费试用,并且可用于商业用途。
- 配置文件非常简单:通俗易懂,即使非专业管理员也能看懂。
- 支持 rewrite重写规则:能根据域名、URL的不同,将HTTP请求分到不同的后端服务器群组。
- 内置的健康检查功能:如果nginx proxy后端的某台服务器宕机了,不会影响前端访问。
- 节省带宽,支持gzip压缩。
- 稳定性高:用于反向代理,宕机的概率微乎其微。
- 支持热部署。在不间断服务的情况下,对软件版本升级。
- nginx在反向代理,rewrite规则,稳定性,静态化文件处理,内存消耗等方面,表现出了很强的优势,选用nginx取代传统的apache 服务器,将会获得多方面的性能提升。
- 支持的操作系统
FreeBSD 3.x,4.x,5.x,6.x i386; FreeBSD 5.x,6.x amd64;Linux 2.2,2.4,2.6 i386; Linux 2.6 amd64;Solaris 8 i386; Solaris 9 i386 and sun4u; Solaris 10 i386;MacOS X (10.4) PPC;Windows XP,Windows Server 2003和Windows 7等。
安装Nginx软件
模块依赖性:Nginx的一些模块需要其他第三方库的支持,例如gzip模块需要zlib 库,rewrite模块需要pcre库,ssl功能需要openssl库等。
安装pcre库软件
具体的安装代码:
#解压软件cd /usr/local/src tar zxvf pcre-7.9.tar.gz#进入解压的目录cd pcre-7.9/ #执行配置./configure #执行编译和安装make && make install cd ../
安装nginx软件
# 创建www组与www用户 groupadd www useradd -g www -s /usr/sbin/nologin www#解压nginx软件tar -zxvf nginx-1.8.1.tar.gz#进入解压的目录cd nginx-1.8.1#配置./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module#其中参数 --with-http_stub_status_module 是为了启用 nginx 的 NginxStatus 功能,用来监控 Nginx 的当前状态#执行编译和安装make && make install
安装完成后,看到如下4个目录
cd /ulsr/local/nginx, 看到如下4个目录 ... conf 配置文件 ... html 网页文件(网站的根目录,就类似与apache里面htdocs目录) ... logs 日志文件 ... sbin 主要二进制程序
Nginx的启动管理
启动
在nginx安装目录sbin目录下面,直接执行nginx即可
可以通过./nginx –h
查看命令帮助
查看是否启动成功,可以使用netstat –tunpl | grep 80
命令
测试配置文件是否正确
/usr/local/nginx/sbin/nginx -t
停止nginx服务
/usr/local/nginx/sbin/nginx –s stop
不停止nginx服务,重新加载配置文件
/usr/local/nginx/sbin/ningx –s reload
配置文件讲解
配置文件介绍
cd nginx/confegrep –v ‘#|^$’ nginx.conf
通过观察,该配置文件有两段
events {}http { server { }}
注意:每一行用分号结束,内容与{之间要有空格worker_processes 1; 配置工作进程的个数,推荐设置为cpu的个数*核心数。worker_connections 1024; 配置工作进程的连接数(一个进程的并发量)
虚拟主机的配置
在http段里面的server段就是配置虚拟主机的,http中每一个server段就是一个虚拟主机
打开nginx.conf配置文件
基于端口的虚拟主机
规范优化nginx配置文件
大家如果了解Apache软件,就会知道apache主配置文件包含虚拟主机子文件的方法,这里也借鉴了Apache的这种包含方法,可以把多个虚拟主机配置成一个个单独的配置文件,仅仅和nginx的主配置文件nginx.conf分离开即可。这里使用语法是 include。
案例:配置一个虚拟主机,www.cms.com ,具体的配置分离开nginx.conf文件。
在nginx的安装目录下面,配置文件目录里面(conf目录)下面,新建一个extra目录,该目录用于存储分离的配置文件。
mkdir extra
在extra目录里面, 新建一个cms.conf文件,用于配置www.cms.com虚拟主机。
server{ listen 80; server_name www.cms.com; location / { root cms; index index.html index.htm; }}
在nginx.conf配置文件里面,引入cms.conf文件。
include extra/cms.conf;server{ listen 80; server_name www.abc.com; location / { root abc; index index.html index.htm; }}
重新加载配置文件
别名配置
所谓虚拟主机别名,就是为虚拟主机设置除了主域名以外的一个或多个域名名字,这样就能实现用户访问的多个域名对应同一个虚拟主机网站的功能。语法:只需在server_name所在行后面添加别名即可。案例:比如我们使用 cms.net cms.com cms.cn 都能访问www.cms.com
日志管理
与nginx日志相关的指令主要有两条,一条是log_format,用来设置日志的格式,另外一条是access_log,用来指定日志文件的存放路径、格式和缓存大小。两条指令在nginx配置文件中的位置可以在http{}之间,也可以在虚拟主机之间,即server{}两个大括号之间。
用log_format来设置日志的格式
#log_format 格式名称 格式样式 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';
在日志格式样式中:
$remote_addr和$http_x_forwarded_for用于记录IP地址$remote_user用于记录远程客户端用户名称;$time_local用于记录访问时间与时区;$request用于记录请求URL与HTTP协议;$status用于记录请求状态,例如成功时状态为200,页面找不到时状态为404;$body_bytes_sent用于记录发送给客户端的文件主体内容大小;$http_referer用于记录是从哪个页面链接访问过来的;$http_user_agent用于记录客户端浏览器的相关信息。
用access_log指令指定日志文件存放路径
Nginx允许针对不同的server做不同的Log ,(有的web服务器不支持,如lighttp)
access_log logs/access_8080.log mylog; 声明log log位置 log格式;
案例:给www.cms.com域名配置日志记录
- 使用log_format定义日志的格式。在nginx.conf配置文件里面,定义日志的格式。
注意:mylog是格式的名称。
- 进入extra目录,打开cms.conf子配置文件,使用access_log指令,声明日志文件的存储位置和名称和使用哪种格式来记录
- 重新加载nginx的配置文件,进行测试,通过测试,发现日志内容如下
$remote_addr和$http_x_forwarded_for都用于记录IP地址,区别是什么?
通过$remote_addr变量拿到的将是反向代理服务器的IP地址。但是,反向代理服务器在转发请求的HTTP头信息中,可以增加 X-Forwarded-For信息,用以记录原有的客户端IP地址和原来客户端请求的服务器地址。这时候,就要用log_format 指令来设置日志格式,让日志记录X-Forwarded-For信息中的IP地址,即客户的真实IP。
编译 php与nginx整合
注意:在nginx中,php是作为独立软件(进程)来运行的,不是作为nginx的一个模块来运行的,独立运行开启的端口是9000,nginx要监听 php的9000端口,当ngxin遇到php文件时,会把这个php的请求转给9000端口的php来处理,nginx本身不能处理php.
独立安装PHP
解压软件
tar -zxvf php-5.3.16.tar.gz
进入到解压的软件目录
cd php-5.3.16
执行如下配置
./configure --prefix=/usr/local/php --enable-fpm
注意:--enable-fpm:以上是让 php作为独立进程运行。
执行make && make install进行安装
make && make instll
复制php.ini配置文件到指定目录
cp php.ini-development /usr/local/php/lib/
php-fpm.conf.default文件改名为php-fpm.conf
cp php-fpm.conf.default php-fpm.conf
启动php服务
/usr/local/php/sbin/php-fpm
关闭php服务
killall php-fpm
PHP与Nginx整合
vi /usr/local/nginx/conf/fcgi.conf 并写入如下内容 fastcgi_param GATEWAY_INTERFACE CGI/1.1; fastcgi_param SERVER_SOFTWARE nginx; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param SCRIPT_NAME $fastcgi_script_name; fastcgi_param REQUEST_URI $request_uri; fastcgi_param DOCUMENT_URI $document_uri; fastcgi_param DOCUMENT_ROOT $document_root; fastcgi_param SERVER_PROTOCOL $server_protocol;fastcgi_param REMOTE_ADDR $remote_addr; fastcgi_param REMOTE_PORT $remote_port; fastcgi_param SERVER_ADDR $server_addr; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_NAME $server_name; # PHP only, required if PHP was built with --enable-force-cgi-redirect fastcgi_param REDIRECT_STATUS 200;
注意:也可以不需要编辑fcgi.conf给文件,可以直接使用自带的fastcgi.conf配置文件。
- 编辑nginx配置文件(找到server项目设置如下内容)
vim /usr/local/nginx/conf/nginx.conf location ~ .*/.(php|php5)?$ { fastcgi_pass 127.0.0.1:9000; #fastcgi(管理PHP), fastcgi_index index.php; include fcgi.conf; }
案例:让www.cms.com运行能够运行php文件
步骤:打开cms.conf配置文件
让Nginx支持TP框架
- 把TP框架的源码包,拷到新建的tp目录
cp thinkphp_3.2.3_full.zip /usr/local/nginx/tp/
- 把tp框架的源码包,进行解压
unzip thinkphp_3.2.3_full.zip
- 修改cms.conf配置文件,配置 成能够支持TP框架
- 重新加载配置文件,进行测试,报错
以上错误说明:./App/目录不可写,让其可写即可。
chmod 777 tp -R
负载均衡
负载均衡配置的原理图
实现一个简单的负载均衡
我们使用基于端口的虚拟主机来模拟两台主机,给负载均衡配置的域名为 www.123.com
配置两个基于端口的虚拟主机
进入到nginx/conf/extra目录,新建一个81.conf和82.conf,两个文件
在nginx目录下面新建一个81 和82的目录,并各自添加index.html文件,为了看到效果,我们让index.html文件的内容不一样
在nginx.conf配置文件里面,添加一个连接池
在nginx.conf配置文件里面,配置一个基于域名的(www.123.com)的虚拟主机
我们在nginx.conf配置文件里面,使用include把81.conf和82.conf引入
重新加载配置文件,进行测试
注意:修改后的代码如下
upstream模块相关说明
server指令:
- 语法:server name [参数]
- 使用环境:upstream
该指令用于指定后端服务器的名称和参数。服务器的名称可以是一个域名,-个ip地址,端口号。在后端服务器名称之后,可以跟以下参数:
weight=number 设置服务器的权重,权重数值越高,被分配到的客户端请求数越多。如果没有设置权重,则为默认权重为1.
max_fails=number 在参数fail_timeout指定的时间内对后端服务器请求失败的次数,如果检测到后端服务器无法连接及发生服务器错误(404错误除外),则标记为失败。如果没有设置,则为默认值1。设为数值0将关闭这项检查。
fail_timeout=time(30s)在经历参数max_fails设置的失败次数后,暂停的世界。
down 标记服务器为永久离线状态,用于ip_hash指令。
backup 仅仅在非backup服务器全部宕机或繁忙的时候,才启用。
nginx在window里面使用
nginx在window里面使用
解压软件,拷贝到指定位置
可以进入到cmd执行,start nginx完成启动
和php的整合
- 把php软件拷贝过来,便于管理一般和nginx同级目录
把php.ini-develp 改成php.ini配置文件
打开php.ini 配置文件,进行如下配置
- 修改加载扩展的路径
- 修改时区(不是必须的)
- 配置让php独立运行
- 为了管理php和nginx,我们使用一个批处理工具,主要是拷贝如下3个文件
- 打开star_nginx.bat文件进行配置
- 打开nginx.conf配置文件,在虚拟主机里面,开启如下代码
注意:直接双击start_nginx.bat开启nginx 直接双击stop_nginx.bat关闭nginx。