关于nginx:Nginx

一、集群架构

服务器架构集群:

多台服务器组成的响应大并发、高数据量拜访的架构体系。

特点:

老本高

可能升高单台服务器的压力,应用流量平均分配到多台服务器

使网站服务架构更加平安稳固

服务器:

提供某种或者多种服务(性能)的机器(计算机)

硬件:性能比拟好的电脑主机

软件:实现各种服务反对特定的协定的软件

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的介绍

  1. 它能够高并发连贯,官网测试可能撑持5万并发连贯,在理论生产环境中能够撑持2到4万并发连贯。
  2. 内存耗费少

Nginx+php(FastCGI)服务器在3万并发连贯下,

开启的10个Nginx过程耗费150MB内存(15MB * 10=150MB)

开启的64个php-cgi过程耗费1280MB内存(20MB*64=1280MB)

  1. 老本低廉

购买F5 BIG-IP ,NetScaler等硬件负载平衡交换机须要10多万甚至几十万人民币。而Nginx为开源软件,能够收费试用,并且可用于商业用途。

  1. 配置文件非常简单:通俗易懂,即便非专业管理员也能看懂。
  2. 反对 rewrite重写规定:能依据域名、URL的不同,将HTTP申请分到不同的后端服务器群组。
  3. 内置的健康检查性能:如果nginx proxy后端的某台服务器宕机了,不会影响前端拜访。
  4. 节俭带宽,反对gzip压缩。
  5. 稳定性高:用于反向代理,宕机的概率微不足道。
  6. 反对热部署。在不间断服务的状况下,对软件版本升级。

nginx在反向代理,rewrite规定,稳定性,动态化文件解决,内存耗费等方面,体现出了很强的劣势,选用nginx取代传统的apache 服务器,将会取得多方面的性能晋升。

三、装置Nginx

1、装置依赖

  1. gcc 装置

装置 nginx 须要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,则须要装置:

yum install gcc gcc-c++
  1. 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
  1. zlib 装置

zlib 库提供了很多种压缩和解压缩的形式, nginx 应用 zlib 对 http 包的内容进行 gzip ,所以须要装置 zlib 库。

yum install -y zlib zlib-devel
  1. 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
  1. 比方立刻敞开过程:

kill –INT nginx的主过程号

  1. 优雅的敞开过程(即等申请完结后,再敞开)

kill –QUIT nginx的主过程号

  1. kill –HUP nginx的主过程号与nginx –s reload一样

把配置文件中的新更新的货色加载到正在运行的nginx的过程中,接着对用户提供服务,然而nginx的过程并没有敞开。即重读配置文件。

能够通过批改配置文件进行测试

  1. 重读日志文件

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、全局配置

  1. worker_processes 1;

    配置工作过程的个数,举荐设置为cpu的个数*外围数。

  2. 不同错误信息存储的地位

    //全局谬误日志定义类型,[ debug | info | notice | warn | error | crit ]

    #error_log logs/error.log;

    #error_log logs/error.log notice;

    #error_log logs/error.log info;

  3. 存储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,

  1. 在conf目录上面新建一个目录

  1. 进入到新建的目录(extra)新建一个文件(nihao.conf)在该文件外面增加虚拟主机的配置。

  1. 关上nginx的配置文件,nginx.conf,引入虚拟主机的配置文件

  1. 执行nginx的从新加载配置文件

  1. 依据虚拟主机外面的配置,新建一个网站的根目录(nihao)

  1. 在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域名配置日志记录,

  1. 在nginx.conf主配置文件外面,配置日志格局的款式。

  1. 在extra/nihao.conf配置文件外面,配置日志文件的存储门路。

查看日志文件

3、定时工作, 日志分隔

失去格式化的日期:

date –d yesterday +%Y%m%d%H%M

  1. 在/date目录上面新建一个脚本runlog.sh

  1. 通过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   

根本用法:

  1. 申请页面

    curl http://www.inux.com

  2. -o保留拜访的网页,是小写的o

    curl –o abc.txt http://www.abc.com

  1. -s不输入进度

    curl –s –o abc.txt http://www.abc.com

  1. -I和-i

    -i是显示返回头信息和网页内容,-I只显示返回头信息

curl –i http://www.abc.com

  1. -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标记;

Flag标记符号 阐明
last 本条规定匹配实现后,持续向下匹配新的locationURL规定
break 本条规定匹配实现即终止,不再匹配前面的任何规定
redirect 返回302长期重定向,浏览器地址栏会显示跳转后的URL地址
permanent 返回301永恒重定向,浏览器地址栏会显示跳转后的url地址

在以上的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中能够写在locationif

格局

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:

<img src=”https://gitee.com/li_ke321/Image/raw/master/img/Nginx/image-20200726221708242.png” alt=”image-20200726221708242″ style=”zoom:200%;” />

1、配置

建设两个基于端口的虚拟主机来模仿两台web服务器

  1. 新建一个www.123.com:81和www.123.com:82的虚拟主机

在extra目录上面新建一个81.conf文件,内容如下:

在extra目录上面新建一个82.conf文件,内容如下:

  1. 在nginx目录上面别离建设81和82的目录,在该目录上面别离建设index.html文件,
  2. 在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服务器全副宕机或忙碌的时候,才启用。

  1. 在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;
     }
     
}

  1. 把之前配置的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、配置

  1. 装置实现后将php.ini-development 复制到/usr/local/php7.0/etc/php.ini
cp php.ini-development /usr/local/php7.0/etc/php.ini

  1. 给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服务过程号码的

  1. 配置辅助配置文件
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

  1. 设置环境变量,使得在任何中央都能够间接拜访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整合

  1. 编辑文件

/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;

  1. 编辑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框架

  1. 批改虚拟主机,增加如下配置,反对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; 
} 

  1. TP框架实现伪动态
location / { # ……省略局部代码
   if (!-e $request_filename) {
           rewrite  ^(.*)$  /index.php?s=/$1  last;
    }
}

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理