一、集群架构
服务器架构集群:
多台服务器组成的响应大并发、高数据量访问的架构体系。
特点:
成本高能够降低单台服务器的压力,使用流量平均分配到多台服务器
使网站服务架构更加安全稳定
服务器:
提供某种或者多种服务(功能)的机器(计算机)
硬件:性能比较好的电脑主机软件:实现各种服务支持特定的协议的软件
1、web服务软件
提供http https协议的服务器,网站网页访问的功能
Apache
Nginx
2、数据库
mysql
oracle
3、负载均衡
负载均衡服务器,分发请求到不同的服务器。使流量平均分配。
硬件级别:F5 性能好,价格高
软件级别:性价比高
lvs linux下分发软件
Nginx upstream功能分发
4、资源服务器
资源服务区存储静态资源,css、js、图片、视频。一般此服务器会有硬盘(SSD固态)读写快速,带宽更大。
5、反向代理服务器
反向代理服务器具有代理请求到对应的服务器的功能,也具有缓存的功能
squid、
varnish、
Nginx、
6、高可用
高可用服务器,用来监控负载均衡服务器,如果一旦负载均衡宕机、会接替负载均衡服务器的工作,继续进行网络的分发工作。
可以认为是负载均衡的备用服务器
heartbeat
keeplive
7、缓存软件
memcached
redis
8、cdn内容分发
二、Nginx的介绍
- 它可以高并发连接,官方测试能够支撑5万并发连接,在实际生产环境中可以支撑2到4万并发连接。
- 内存消耗少
Nginx+php(FastCGI)服务器在3万并发连接下,
开启的10个Nginx进程消耗150MB内存(15MB * 10=150MB)
开启的64个php-cgi进程消耗1280MB内存(20MB*64=1280MB)
- 成本低廉
购买F5 BIG-IP ,NetScaler等硬件负载均衡交换机需要10多万甚至几十万人民币。而Nginx为开源软件,可以免费试用,并且可用于商业用途。
- 配置文件非常简单:通俗易懂,即使非专业管理员也能看懂。
- 支持 rewrite重写规则:能根据域名、URL的不同,将HTTP请求分到不同的后端服务器群组。
- 内置的健康检查功能:如果nginx proxy后端的某台服务器宕机了,不会影响前端访问。
- 节省带宽,支持gzip压缩。
- 稳定性高:用于反向代理,宕机的概率微乎其微。
- 支持热部署。在不间断服务的情况下,对软件版本升级。
nginx在反向代理,rewrite规则,稳定性,静态化文件处理,内存消耗等方面,表现出了很强的优势,选用nginx取代传统的apache 服务器,将会获得多方面的性能提升。
三、安装Nginx
1、安装依赖
- gcc 安装
安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,则需要安装:
yum install gcc gcc-c++
- PCRE pcre-devel 安装
PCRE(Perl Compatible Regular Expressions) 是一个Perl库,包括 perl 兼容的正则表达式库。
nginx 的 http 模块使用 pcre 来解析正则表达式,所以需要在 linux 上安装 pcre 库,pcre-devel 是使用 pcre 开发的一个二次开发库。nginx也需要此库。
yum install -y pcre pcre-devel
- zlib 安装
zlib 库提供了很多种压缩和解压缩的方式, nginx 使用 zlib 对 http 包的内容进行 gzip ,所以需要安装 zlib 库。
yum install -y zlib zlib-devel
- OpenSSL 安装
OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。
nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http),所以需要在 Centos 安装 OpenSSL 库。
yum install -y openssl openssl-devel
2、安装软件
直接下载安装包,地址:https://nginx.org/en/download.html
使用wget
命令下载(推荐)。确保系统已经安装了wget,如果没有安装,执行 yum install wget 安装。
wget -c https://nginx.org/download/nginx-1.12.0.tar.gz
解压
tar -zxvf nginx-1.12.0.tar.gz
cd nginx-1.12.0
configure配置nginx
1.使用默认配置
./configure
2.自定义配置(不推荐)
./configure \
--prefix=/usr/local/nginx \
--conf-path=/usr/local/nginx/conf/nginx.conf \
--pid-path=/usr/local/nginx/conf/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi
注:将临时文件目录指定为/var/temp/nginx,需要在/var下创建temp及nginx目录
编译&安装
make && make install
查找安装路径:
whereis nginx
注意:安装完成后,会有4个目录,
conf 配置文件html 网页文件,网站的根目录,就类似与apache里面的htdocs目录。
logs 日志文件
sbin 主要二进制程序,启动程序命令
如果nginx配置文件有修改,可以通过如下方式测试配置文件是否正确:/usr/local/nginx/sbin/nginx -t
查看Nginx编译时的参数
/usr/local/nginx/sbin/nginx -V
3、Nginx的启动管理
启动、停止nginx
cd /usr/local/nginx/sbin/
./nginx 启动
参数 "-c" 指定了配置文件的路径,如果不加 "-c" 参数,Nginx 会默认加载其安装目录的 conf 子目录中的 nginx.conf 文件。./nginx -s stop 此方式相当于先查出nginx进程id再使用kill命令强制杀掉进程。
./nginx -s quit 此方式停止步骤是待nginx进程处理任务完毕进行停止。
./nginx -s reload 不停止nginx的服务,重新加载配置文件
启动时报80端口被占用:
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
解决办法:1、安装net-tool 包:yum install net-tools
重启 nginx
1.先停止再启动(推荐):
对 nginx 进行重启相当于先停止再启动,即先执行停止命令再执行启动命令。如下:
./nginx -s quit
./nginx
2.重新加载配置文件:
当 ngin x的配置文件 nginx.conf 修改后,要想让配置生效需要重启 nginx,使用-s reload
不用先停止 ngin x再启动 nginx 即可将配置信息在 nginx 中生效,如下:
./nginx -s reload
开机自启动
即在rc.local
增加启动代码就可以了。
vi /etc/rc.local
增加一行 /usr/local/nginx/sbin/nginx
设置执行权限:
chmod 755 rc.local
4、Nginx的信号控制
信号控制,是管理nginx进程的一种方式。
具体的用法:
kill –信号选项 nginx的主进程号
https://www.nginx.com/resourc...
查询nginx进程:
ps aux|grep nginx
- 比如立即关闭进程:
kill –INT nginx的主进程号
- 优雅的关闭进程(即等请求结束后,再关闭)
kill –QUIT nginx的主进程号
- kill –HUP nginx的主进程号与nginx –s reload一样
把配置文件中的新更新的东西加载到正在运行的nginx的进程中,接着对用户提供服务,但是nginx的进程并没有关闭。即重读配置文件。可以通过修改配置文件进行测试
- 重读日志文件
Kill -USR1 `cat /xxx/path/log/nginx.pid`重新读日志文件,日志文件改名备份后,使用,否则仍然写入原来的日志文件。
注意:
可以使用nginx.pid文件代替nginx的主进程号
即:kill –信号控制 `cat /xxx/path/log/nginx.pid`
四、配置文件讲解
1、配置文件介绍
下面是去掉注释后,配置文件里面的内容;
egrep –v “#|^$” nginx.conf
通过观察,该配置文件有两段
events {
}
http {
server {
}
}
注意:每一行用分号结束,内容与{之间要有空格。
2、全局配置
- worker_processes 1;
配置工作进程的个数,推荐设置为cpu的个数*核心数。
不同错误信息存储的位置
//全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
存储nginx进程号的文件
pid logs/nginx.pid;
3、事件配置
worker_connections 1024;配置每个工作进程支持的最大连接数(一个进程的并发量)
events {
//单个cpu进程的最大并发连接数
//根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行
//同时要考虑,服务器并不是100%为nginx服务,还有其他工作要做,因此不能达到理论峰值
worker_connections 1024;
//并发总数是 worker_processes 和 worker_connections 的乘积
//即 max_clients = worker_processes * worker_connections
}
4、虚拟主机配置
在http段里面的server段就是配置虚拟主机的,http中每一个server段就是一个虚拟主机
1、基于域名的虚拟主机
配置一个www.abc.com的虚拟主机,
第一步:打开nginx的配置文件,进行如下配置。
第二步:修改完成配置文件后,要执行重写加载配置文件
/usr/local/nginx/sbin/nginx –s reload
第三步:在/usr/local/nginx/新建一个abc的目录,该目录就是www.abc.com域名的根目录。
并在里面添加一些测试文件。
在window系统hosts 文件里面做好解析;
测试效果如下:
也可以通过在linux主机里面本地测试
echo "127.0.0.1 www.abc.com" >> /etc/hosts
curl www.abc.com
2、基于端口的虚拟主机
在配置文件里面,如下配置,
测试效果如下:
3、 基于ip的虚拟主机
主要实现方式是通过单网卡多ip的方式来实现的;通过如下命令临时在eth0网卡上增加1一个不同的IP地址;
ip addr add 192.168.1.101/24 dev eth0
虚拟主机配置如下:
效果如下:
注意:基于IP的虚拟主机配置在生产环境中不经常使用,一般配置在负载均衡后面的服务器上面,知道即可。
5、规范优化Nginx配置文件
大家如果了解apache软件,就会知道apache主配置文件包含虚拟主机子文件的方法,这里也借鉴了apache的这种包含方法,
可以把多个虚拟主机配置成一个个单独的配置文件,仅仅和nginx的主配置文件nginx.conf分离开即可。
这里使用语法是 include,
- 在conf目录下面新建一个目录
- 进入到新建的目录(extra)新建一个文件(nihao.conf)在该文件里面添加虚拟主机的配置。
- 打开nginx的配置文件,nginx.conf,引入虚拟主机的配置文件
- 执行nginx的重新加载配置文件
- 根据虚拟主机里面的配置,新建一个网站的根目录(nihao)
- 在window系统里面,配置hosts文件,访问效果如下:
6、别名配置
所谓虚拟主机别名,就是为虚拟主机设置除了主域名以外的一个或多个域名名字,这样就能实现用户访问的多个域名对应同一个虚拟主机网站的功能。
语法:只需在server_name所在行后面添加别名即可。
比如刚才设置的www.nihao.com域名,我们添加两个别名
配置window里面的hosts文件
访问效果如下:
五、日志管理
与 nginx日志相关的指令主要有两条,一条是log_format,用来设置日志的格式,另外一条是access_log,用来指定日志文件的存放路径、格式和缓存大小。
两条指令在nginx配置文件中的位置可以在http{}之间,也可以在虚拟主机之间,即server{}两个大括号之间。
1、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用于记录客户端浏览器的相关信息。
注意点:
$remote_addr和$http_x_forwarded_for都用于记录IP地址,区别是什么?
通过$remote_addr变量拿到的将是反向代理服务器(负载均衡)的IP地址。但是,反向代理服务器(负载均衡)在转发请求的HTTP头信息中,可以增加 X-Forwarded-For信息,用以记录原有的客户端IP地址和原来客户端请求的服务器地址。
这时候,就要用log_format 指令来设置日志格式,让日志记录X-Forwarded-For信息中的IP地址,即客户的真实IP
2、access_log指定日志文件存放路径
Nginx允许针对不同的server做不同的log,(有的web服务器不支持,如Lighttpd)
语法:
声明log log位置 log格式;
例:
access_log logs/access_8080.log mylog;
案例:给www.nihao.com域名配置日志记录,
- 在nginx.conf主配置文件里面,配置日志格式的样式。
- 在extra/nihao.conf配置文件里面,配置日志文件的存储路径。
查看日志文件
3、定时任务, 日志分隔
得到格式化的日期:
date –d yesterday +%Y%m%d%H%M
- 在/date目录下面新建一个脚本runlog.sh
- 通过crontab –e定时执行,脚本文件。
查看定时任务crontab -l编辑定时任务crontab –e
删除定时任务crontab -r
分 时 日 月 周 命令
#每天凌晨0点10分执行
10 0 * * * sh /date/runlog.sh
星号参数的解释说明:
# 六、location语法
1、location的作用
location指令的作用是根据用户请求的URL来执行不同的应用。
在虚拟主机的配置中,是必不可少的,location可以把网站的不同部分定位到不同的处理方式上。
2、基本语法
location [=|~|~*|^~] patt {
}
中括号可以不写任何参数,此时成为一般匹配。
也可以写参数。
因此,大类型可以分为3种。
精确匹配location = patt {
}
一般匹配
location patt {
}
正则匹配
location ~ patt{
}
3、curl工具使用
在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具,可以说是一款很强大的http命令行工具。
注意:
#在linux下面配置的虚拟主机测试时,要在/etc/hosts文件里面做好解析
vim /etc/hosts
基本用法:
- 请求页面
curl http://www.inux.com
- -o保存访问的网页,是小写的o
curl –o abc.txt http://www.abc.com
- -s不输出进度
curl –s –o abc.txt http://www.abc.com
- -I和-i
-i是显示返回头信息和网页内容,-I只显示返回头信息
curl –i http://www.abc.com
- -w 输出指定格式的内容
输出格式由普通字符串和任意数量的变量组成,输出变量需要按照%{variable_name}的格式
例:%{http_code}表示状态码。
curl –s –o /dev/null –I –w ''%{http_code}n" http://www.abc.com
4、匹配实例
1、精准匹配与一般匹配
location = /demo {
}
location /demo {
}
效果如下:
2、一般匹配长度问题
location /demo{}
location /demo/abc {}
效果如下:
总结:访问的路径中,如果有多个location都符合,则匹配到最长字符串(location)优先
3、一般匹配与正则匹配
location /images {
return 4;
}
location ~* .(gif|jpg|jpeg)$ {
return 5;
}
注意:
~ 开头表示区分大小写的正则匹配~* 开头表示不区分大小写的正则匹配
域名/images/abc.jpg
总结:如果常规字符串,与正则都匹配,则优先匹配正则
注意:也可以通过在字符串规则前设置^~,表示匹配到常规字符串,不做正则匹配检查
location ^~ /image {}
location ~* .(gif|jpg|png|js|css)${}
域名/images/abc.jpg
4、默认匹配
/为默认匹配,即如果没有匹配上其他的location,则最后匹配‘默认匹配’部分;
location / {
具体配置
}
总结:location的命中过程是这样的;
(1)先判断精准匹配,如果匹配成功,立即返回结果并结束解析过程
(2)判断一般匹配,如果有多个匹配成功,记录下来最长的匹配规则,
(3)继续判断正则匹配,按匹配里的正则表达式顺序为准,由上到下开始匹配,一旦匹配成功一个,立即返回结果,结束解析过程。
注意:一般匹配中,顺序无所谓,是按匹配的场地来确定的;正则匹配中,顺序有所谓,因为是从前向后匹配的。
不同URL及特殊字符组合匹配的顺序说明
顺序 | 不同URL及特殊字符组合匹配 | 匹配说明 | |
---|---|---|---|
1 | Location =/{ | 精确匹配 | |
2 | Location ^~ { | 匹配常规字符串,不做正则匹配检查 | |
3 | Location ~* .(gif\ | jpg) { | 正则匹配 |
4 | Location /demo/ { | 匹配常规字符串,如果有正则,则优先匹配正则 | |
5 | Location / { | 所有location都不能匹配后的默认匹配 |
七、Nginx rewrite
Nginx rewrite主要功能是实现URL地址重写,需要PCER的支持,前面已经安装。
语法:
rewrite 匹配url 目标url [flag] # 应用位置 server location if段中
rewrite 是实现URL重写的关键指令,根据匹配url部分的内容,重定向到目录url上,结尾是flag标记;
顺序 | 不同URL及特殊字符组合匹配 | 匹配说明 | ||
---|---|---|---|---|
1 | Location =/{ | 精确匹配 | ||
2 | Location ^~ { | 匹配常规字符串,不做正则匹配检查 | ||
3 | Location ~* .(gif\ | jpg)\ | 正则匹配 | |
4 | Location /demo/ | 匹配常规字符串,如果有正则,则优先匹配正则 | ||
5 | Location / { | 所有location都不能匹配后的默认匹配 |
在以上的flag标记中,
last和break用来实现url重写,浏览器地址栏的URL地址不变,单在服务器端访问的程序及路径发生了变化。
redirect和permanent用来实现URL跳转,浏览器地址栏会显示跳转后的URL地址。
1、基本案例
案例1:简单重写,访问index.php 重写到abc.html
rewrite ^/index\.php /abc.html last;
使用 www.nihao.com域名来测试,打开extra目录下面的nihao.conf配置文件。
访问效果如下:
案例2:实现访问 http://www.nihao.com时跳转到http://www.abc.com
需要对www.nihao.com域名对应配置文件,进行配置,打开extra/nihao.conf文件配置内容如下:
思考:也就是说我们访问www.nihao.com/abc.php 则变成访问www.abc.com/abc.php
rewrite ^/(.*) http://www.abc.com/$1 break;
点号,在正则里面表示除了换行符以外的任何字符,星号,表示0到多个。
使用.*来表示任何字符。
$1符号,表示前面(.*)里面的内容。
访问效果如下:
2、break与last区别
location ~ ^/break {
rewrite ^/break /test break;
}
location ~ ^/last {
rewrite ^/last /test last; #本条规则匹配完成后,继续向下匹配新的locationURL规则
}
location /test{
root abc;
index test.html; #当访问 域名/test url时,实际上是返回的 abc/test/test.html页面的内容
}
在/usr/local/nginx/abc目录下面新建一个test目录,在里面新建一个test.html文件;
3、redirect与permanent区别
301永久重定向,浏览器会记住,
比如a.com网站 301到 b.com网站,
浏览器中输入a.com时,就不请求a.com了,就直接请求b.com网站了;
302临时重定向,浏览器不记住,
比如a.com网站 302到 b.com网站,
浏览器中输入a.com时,还是请求a.com网站,根据a.com网站响应的location内容,再去请求b.com网站;
301重定向:
rewrite ^/(.*) http://www.abc.com/$1 permanent;
302重定向:
302重定向只是暂时的重定向,搜索引擎会抓取新的内容而保留旧的地址,因为服务器返回302,所以,搜索搜索引擎认为新的网址是暂时的。
而301重定向是永久的重定向,搜索引擎在抓取新的内容的同时也将旧的网址替换为了重定向之后的网址。
八、nginx缓存(expires)
nginx缓存的设置可以提高网站性能,对于网站的图片,尤其是新闻网站,图片一旦发布,改动的可能是非常小的,为了减小对服务器请求的压力,提高用户浏览速度,我们可以通过设置nginx中的expires,让用户访问一次后,将图片缓存在用户的浏览器中,且时间比较长的缓存。
原理:
当nginx设置了expires后,例如设置为:expires 10d; 那么,所在的location或if的内容,用户在10天内请求的时候,都只会访问浏览器中的缓存,而不会去请求nginx。
注意:这种缓存方式只能在用户不对浏览器强制刷新的情况下生效。
expires在nginx中配置的位置:在nginx中可以写在location或if段
格式
expires 30s; #缓存30秒
expires 30m; #缓存30分钟
expires 2h; #缓存2小时
expires 30d; #缓存30天
注:服务器的时间要准确,如果服务器的时间落后于实际时间,可能导致缓存失效。
配置expires
#缓存图片文件
location ~ \.(gif|jpg|jpeg|png|bmp|ico)$ {
root /var/www/img/;
#缓存时间为30天
expires 30d;
}
九、Nginx压缩gzip
参数详解:
gzip on; #开启gzip压缩功能
gzip_min_length 1k;#(开始压缩的最小长度,再小不要压缩)
#设置允许压缩的页面最小字节数,页面字节数从header头的content-length中获取。默认值是0,不管页面多大都进行压缩。建议设置成大于1k。如果小于1k可能会越压越大。
gzip_buffers 4 16k;#(压缩在内存中缓冲几块,每块多大?)
#压缩缓冲区大小。表示申请4个单位为16k的内容作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果。
gzip_disable;#正则匹配,什么样的uri不进行gzip压缩。
gzip_http_version 1.1;
#压缩版本(默认1.1,前端为squid2.5时使用1.0)用于设置识别http协议版本,默认是1.1,目前大部分浏览器已经支持gzip解压,使用默认即可。
gzip_comp_level 6;
#压缩比率。用来指定gzip压缩比,1压缩比量小,处理速度快;9压缩比量大,传输速度快,但处理最慢,也必将消耗cpu资源。
gzip_types text/plain application/x-javascript text/css application/xml;
#用来指定压缩的类型,“text/html”类型总是会被压缩。
gzip_vary on;#是否传输gzip压缩标志。#vary header支持。该选项可以让前端的缓存服务器缓存经过gzip压缩的页面,例如用squid缓存经过nginx压缩的数据。
gzip_proxied Nginx做为反向代理的时候启用:
- off – 关闭所有的代理结果数据压缩
- expired – 如果header中包含”Expires”头信息,启用压缩
- no-cache – 如果header中包含”Cache-Control:no-cache”头信息,启用压缩
- no-store – 如果header中包含”Cache-Control:no-store”头信息,启用压缩
- private – 如果header中包含”Cache-Control:private”头信息,启用压缩
- no_last_modified – 启用压缩,如果header中包含”Last_Modified”头信息,启用压缩
- no_etag – 启用压缩,如果header中包含“ETag”头信息,启用压缩
- auth – 启用压缩,如果header中包含“Authorization”头信息,启用压缩
- any – 无条件压缩所有结果数据
语法:gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;
默认 gzip_proxied off;
位置 http, server, location
要注意:需要和不需要压缩的对象
(1)大于1k的纯文本文件html,js,css,xml,html.
(2)图片,视频等不要压缩,因为不但不会减小,在压缩时消耗cpu和内存资源。
没有压缩时,文件大小还是原来的大小
进行压缩配置如下;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_comp_level 6;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_disable "MSIE [1-6]\."; #配置禁用gzip条件,支持正则。此处表示ie6及以下不启用gzip(因为ie低版本不支持)
gzip_vary on;
压缩效果如下;
十、解决高并发思路
什么是网站并发连接?
网站服务器在单位时间内能够处理的最大连接数。
负载均衡?
硬件:立竿见影,效果非常好,价格非常昂贵,比如F5-BIGIP
软件:lvs(linux virtual server) , nginx(web服务器,负载均衡)
负载均衡实现策略
(1)轮询 默认负载均衡器把请求轮流转发给后面的web服务器。
(2)ip哈希
同一个地址的客户端,始终请求同一台主机。
(3)最少连接
负载均衡器把请求给负载最小的哪台服务器。
十一、负载均衡
此架构,最少需要三台 服务器
负载均衡服务器:Nginx
web1:
web2:
1、配置
建立两个基于端口的虚拟主机来模拟两台web服务器
- 新建一个www.123.com:81和www.123.com:82的虚拟主机
在extra目录下面新建一个81.conf文件,内容如下:
在extra目录下面新建一个82.conf文件,内容如下:
- 在nginx目录下面分别建立81和82的目录,在该目录下面分别建立index.html文件,
- 在nginx.conf文件里面,建立一个连接池
语法:
#负载均衡服务器配置
upstream 连接池名称 {
#server指令:用于指定后端服务器的名称和参数。服务器的名称可以是一个域名,一个ip地址,端口号。
server name weight=权重 max_fails=最大失败次数 fail_timeout=失败超时时间;
server name weight=权重 max_fails=最大失败次数 fail_timeout=失败超时时间;
}
weight=number 设置服务器的权重,权重数值越高,被分配到的客户端请求数越多。如果没有设置权重,则为默认权重为1.max_fails=number 在参数fail_timeout指定的时间内对后端服务器请求失败的次数,如果检测到后端服务器无法连接及发生服务器错误(404错误除外),则标记为失败。如果没有设置,则为默认值1。设为数值0将关闭这项检查。
fail_timeout=time(30s) 在经历参数max_fails设置的失败次数后,暂停的时间。
down 标记服务器为永久离线状态,用于ip_hash指令。
backup 仅仅在非backup服务器全部宕机或繁忙的时候,才启用。
- 在nginx.conf文件里面,建立一个www.123.com的虚拟主机
server {
listen 80;
server_name www.123.com
location / {
proxy_pass http://连接池名称; #将当前请求反向代理到URL参数指定的服务器上
#proxy_set_header用来设定被代理服务器接收到的header信息
proxy_set_header Host $proxy_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
- 把之前配置的81.conf和82.conf文件引入nginx.conf
效果如下:
2、session丢失的问题
不同的服务器,需要同session判断用户的状态
默认session是存储到服务器的硬盘文件中,不能够共享。
session丢失会造成以下问题:
- 用户状态无法判断 用户是否登录
- 验证码没有办法验证 验证码生成值和校验的服务器不再同一个
解决方案:
- 入库 memcache mysql redis
- 硬盘共享方式 磁盘共享方式
- ip_hash hash一致性 让同一个用户访问同一台服务器
十二、安装PHP
监听 127.0.0.1的9000端口,当ngxin遇到php文件时,会把这个php的请求转给9000端口的php来处理,nginx本身不能处理php.
1、安装
rz //上传php-7.0.25.tar.gz到/home/jinnan/tar
cd /home/jinnan/tar
tar zxf php-7.0.25.tar.gz
cd php-7.0.25
处理依赖
yum -y install libxml2-devel openssl-devel libcurl libcurl-devel libpng-devel freetype-devel libxslt-devel
configure配置
就是去除apache参数,增加enable-fpm和--with-config-file-path参数,就两个变化
./configure \
--prefix=/usr/local/php7.0 \
--with-config-file-path=/usr/local/php7.0/etc \
--with-curl --with-freetype-dir --with-gd \
--with-gettext --with-iconv-dir --with-kerberos \
--with-libxml-dir \
--with-mysqli --with-openssl --with-pcre-regex \
--with-pdo-mysql --with-pear --with-png-dir \
--with-xmlrpc --with-xsl --with-zlib \
--enable-bcmath --enable-libxml \
--enable-inline-optimization \
--enable-gd-native-ttf \
--enable-mbregex --enable-mbstring --enable-opcache \
--enable-pcntl --enable-shmop --enable-soap \
--enable-sockets --enable-sysvsem \
--enable-xml --enable-zip \
--enable-fpm
参数说明
--with-config-file-path 设定php.ini的存储目录--with-curl 打开curl的支持
--with-freetype-dir 字体库支持
--with-gd 画图技术支持
--with-gettext 支持开发多语言系统
--with-iconv-dir iconv函数库能够完成各种字符集间的转换
--with-kerberos kerberos支持
--with-libxml-dir libxml2库的支持
--with-mysqli Mysqli数据库的支持
--with-openssl openssl的支持,加密传输时用到的
--with-pcre-regex 正则表达式支持
--with-pdo-mysql pdo-mysql支持
--with-pear pear是PHP的扩展和应用程序库,包含了很多有用的类
--with-png-dir png图片支持
--with-xmlrpc xml相关的扩展库支持
--with-xsl 打开XSLT 文件支持,扩展了libXML2库 ,需要libxslt软件
--with-zlib zlib压缩库支持
--enable-bcmath 图片大小调整技术支持
--enable-libxml xml支持
--enable-inline-optimization 优化线程,给php整体做性能优化处理
--enable-gd-native-ttf 画图字体库支持,支持TrueType字符串函数库
--enable-mbregex 正则表达式支持
--enable-mbstring mb宽字节函数库支持
--enable-opcache 缓存支持
--enable-pcntl pcntl扩展可以支持php的多线程操作
--enable-shmop shmop是一个易于使用的功能集,允许PHP读,写,创建和删除UNIX共享内存段
--enable-sysvsem 作用同上
--enable-soap SOAP 的全称为简单对象访问协议 (Simple Object Access Protocol)。它是一种基于 XML 的,可扩展的通信协议。SOAP 提供了一种标准,使得运行在不同平台上并使用不同的编程语言编写的应用程序可以互相进行通信
--enable-sockets sockets 支持
--enable-xml xml支持
--enable-zip php支持对zip压缩包处理
--enable-fpm 将php作为独立服务运行
php执行完毕configure的效果
make && make install
执行完毕效果:
2、配置
- 安装完成后将php.ini-development 复制到/usr/local/php7.0/etc/php.ini
cp php.ini-development /usr/local/php7.0/etc/php.ini
- 给php-fpm服务,创建服务配置文件
cd /usr/local/php7.0/etc
#给php服务,创建服务配置文件
cp php-fpm.conf.default php-fpm.conf
vim /usr/local/php7.0/etc/php-fpm.conf
#找到如下内容:
;pid = run/php-fpm.pid
#去除;修改为:
pid = run/php-fpm.pid
上述文件是用于保存php服务进程号码的
- 配置辅助配置文件
cd /usr/local/php7.0/etc/php-fpm.d
cp www.conf.default www.conf
/usr/local/php7.0/etc/php-fpm.conf: 是php服务的主配置文件/usr/local/php7.0/etc/php-fpm.d/www.conf: 是php服务辅助配置文件,需要被上述的php-fpm.conf引入
3、控制服务
启动php服务
/usr/local/php7.0/sbin/php-fpm
查看php服务进程
netstat -lntp
- 设置环境变量,使得在任何地方都可以直接访问php-fpm
vim /etc/profile
在文档最后设置如下内容:
export PATH=/usr/local/php7.0/sbin:$PATH
也可以配置nginx的环境变量
export PATH=/usr/local/nginx/sbin:$PATH
使得环境变量立即生效
source /etc/profile
4、修改配置
修改php时区:
vim /usr/local/php7.0/etc/php.ini
重启php服务:
5、php与Nginx整合
- 编辑文件
/usr/local/nginx/conf/fastcgi.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;
- 编辑nginx配置文件
vim /usr/local/nginx/conf/nginx.conf
#找到server项目设置如下内容
location ~ .*\.(php|php5)?$
{
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
在nihao目录下面新建一个php文件,进行测试。
6、部署tp框架
- 修改虚拟主机,添加如下配置,支持TP框架。
location ~ .+\.php($|/) {
set $script $uri;
set $path_info "/";
if ($uri ~ "^(.+\.php)(/.+)") {
set $script $1;
set $path_info $2;
}
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php?IF_REWRITE=1;
include fastcgi.conf;
fastcgi_param PATH_INFO $path_info;
fastcgi_param SCRIPT_FILENAME $document_root/$script;
fastcgi_param SCRIPT_NAME $script;
}
- TP框架实现伪静态
location / { # ……省略部分代码
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=/$1 last;
}
}