关于nginx:Nginx

8次阅读

共计 17410 个字符,预计需要花费 44 分钟才能阅读完成。

一、集群架构

服务器架构集群:

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

特点:

老本高

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

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

服务器:

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

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

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

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

正文完
 0