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_第1张图片

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

160905180451094

注意:安装完成后,会有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_第2张图片

查询nginx进程:

ps aux|grep nginx
  1. 比如立即关闭进程:
kill –INT nginx的主进程号

Nginx_第3张图片

  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

Nginx_第4张图片

通过观察,该配置文件有两段

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的配置文件,进行如下配置。

Nginx_第5张图片

第二步:修改完成配置文件后,要执行重写加载配置文件

/usr/local/nginx/sbin/nginx –s reload

image-20200726093033144

第三步:在/usr/local/nginx/新建一个abc的目录,该目录就是www.abc.com域名的根目录。

并在里面添加一些测试文件。

Nginx_第6张图片

在window系统hosts 文件里面做好解析;

Nginx_第7张图片

测试效果如下:

Nginx_第8张图片

也可以通过在linux主机里面本地测试

echo "127.0.0.1 www.abc.com" >> /etc/hosts

curl www.abc.com

2、基于端口的虚拟主机

在配置文件里面,如下配置,

Nginx_第9张图片

测试效果如下:

Nginx_第10张图片

3、 基于ip的虚拟主机

主要实现方式是通过单网卡多ip的方式来实现的;通过如下命令临时在eth0网卡上增加1一个不同的IP地址;

ip addr add 192.168.1.101/24 dev eth0

Nginx_第11张图片

虚拟主机配置如下:

Nginx_第12张图片

效果如下:

Nginx_第13张图片

注意:基于IP的虚拟主机配置在生产环境中不经常使用,一般配置在负载均衡后面的服务器上面,知道即可。

5、规范优化Nginx配置文件

大家如果了解apache软件,就会知道apache主配置文件包含虚拟主机子文件的方法,这里也借鉴了apache的这种包含方法,

可以把多个虚拟主机配置成一个个单独的配置文件,仅仅和nginx的主配置文件nginx.conf分离开即可。

这里使用语法是 include,

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

image-20200726095335725

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

Nginx_第14张图片

Nginx_第15张图片

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

Nginx_第16张图片

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

image-20200726095608278

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

image-20200726095633748

  1. 在window系统里面,配置hosts文件,访问效果如下:

Nginx_第17张图片

6、别名配置

所谓虚拟主机别名,就是为虚拟主机设置除了主域名以外的一个或多个域名名字,这样就能实现用户访问的多个域名对应同一个虚拟主机网站的功能。

语法:只需在server_name所在行后面添加别名即可。

比如刚才设置的www.nihao.com域名,我们添加两个别名

Nginx_第18张图片

配置window里面的hosts文件

Nginx_第19张图片

访问效果如下:

Nginx_第20张图片

五、日志管理

与 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

Nginx_第21张图片

2、access_log指定日志文件存放路径

Nginx允许针对不同的server做不同的log,(有的web服务器不支持,如Lighttpd)

语法:

声明log    log位置        log格式; 

例:

access_log logs/access_8080.log mylog;

案例:给www.nihao.com域名配置日志记录,

  1. 在nginx.conf主配置文件里面,配置日志格式的样式。

Nginx_第22张图片

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

Nginx_第23张图片

查看日志文件

Nginx_第24张图片

3、定时任务, 日志分隔

得到格式化的日期:

date –d yesterday +%Y%m%d%H%M
  1. 在/date目录下面新建一个脚本runlog.sh

Nginx_第25张图片

  1. 通过crontab –e定时执行,脚本文件。
查看定时任务crontab -l

编辑定时任务crontab –e

删除定时任务crontab -r

分 时 日 月 周 命令

#每天凌晨0点10分执行
10 0 * * * sh /date/runlog.sh

星号参数的解释说明:

Nginx_第26张图片

Nginx_第27张图片

# 六、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   

Nginx_第28张图片

基本用法:

  1. 请求页面

    curl http://www.inux.com

    image-20200726113630554

  2. -o保存访问的网页,是小写的o

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

Nginx_第29张图片

  1. -s不输出进度

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

image-20200726113752694

  1. -I和-i

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

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

Nginx_第30张图片

  1. -w 输出指定格式的内容

输出格式由普通字符串和任意数量的变量组成,输出变量需要按照%{variable_name}的格式

例:%{http_code}表示状态码。

curl –s –o /dev/null –I –w ''%{http_code}n" http://www.abc.com

image-20200726114019582

4、匹配实例

1、精准匹配与一般匹配

location = /demo {

}

location /demo {

}

Nginx_第31张图片

效果如下:

image-20200726114739540

2、一般匹配长度问题

location /demo{}

location /demo/abc {}

Nginx_第32张图片

效果如下:

image-20200726115536181

总结:访问的路径中,如果有多个location都符合,则匹配到最长字符串(location)优先

3、一般匹配与正则匹配

location /images {

​ return 4;

}

location ~* .(gif|jpg|jpeg)$ {

​ return 5;

}

注意:

~ 开头表示区分大小写的正则匹配

~* 开头表示不区分大小写的正则匹配

Nginx_第33张图片

域名/images/abc.jpg

image-20200726120039819

总结:如果常规字符串,与正则都匹配,则优先匹配正则


注意:也可以通过在字符串规则前设置^~,表示匹配到常规字符串,不做正则匹配检查

location ^~ /image {}

location ~* .(gif|jpg|png|js|css)${}

Nginx_第34张图片

域名/images/abc.jpg

image-20200726120641882

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配置文件。

Nginx_第35张图片

访问效果如下:

Nginx_第36张图片

案例2:实现访问 http://www.nihao.com时跳转到http://www.abc.com

需要对www.nihao.com域名对应配置文件,进行配置,打开extra/nihao.conf文件配置内容如下:

Nginx_第37张图片

思考:也就是说我们访问www.nihao.com/abc.php 则变成访问www.abc.com/abc.php

rewrite ^/(.*)  http://www.abc.com/$1 break;
点号,在正则里面表示除了换行符以外的任何字符,

星号,表示0到多个。

使用.*来表示任何字符。

$1符号,表示前面(.*)里面的内容。

访问效果如下:

Nginx_第38张图片

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页面的内容
}    

Nginx_第39张图片

在/usr/local/nginx/abc目录下面新建一个test目录,在里面新建一个test.html文件;

image-20200726170522944

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;

Nginx_第40张图片

Nginx_第41张图片

302重定向

Nginx_第42张图片

302重定向只是暂时的重定向,搜索引擎会抓取新的内容而保留旧的地址,因为服务器返回302,所以,搜索搜索引擎认为新的网址是暂时的。

而301重定向是永久的重定向,搜索引擎在抓取新的内容的同时也将旧的网址替换为了重定向之后的网址。

Nginx_第43张图片

八、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和内存资源。

没有压缩时,文件大小还是原来的大小

Nginx_第44张图片

进行压缩配置如下;

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;      

Nginx_第45张图片

压缩效果如下;

Nginx_第46张图片

十、解决高并发思路

什么是网站并发连接?

网站服务器在单位时间内能够处理的最大连接数。

负载均衡?

硬件:立竿见影,效果非常好,价格非常昂贵,比如F5-BIGIP

软件:lvs(linux virtual server) , nginx(web服务器,负载均衡)

负载均衡实现策略

(1)轮询 默认

负载均衡器把请求轮流转发给后面的web服务器。

(2)ip哈希

同一个地址的客户端,始终请求同一台主机。

(3)最少连接

负载均衡器把请求给负载最小的哪台服务器。

Nginx_第47张图片

十一、负载均衡

此架构,最少需要三台 服务器

负载均衡服务器:Nginx

web1:

web2:

image-20200726221708242

1、配置

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

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

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

Nginx_第48张图片

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

Nginx_第49张图片

  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服务器全部宕机或繁忙的时候,才启用。

Nginx_第50张图片

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

Nginx_第51张图片

  1. 把之前配置的81.conf和82.conf文件引入nginx.conf

效果如下:

Nginx_第52张图片

2、session丢失的问题

不同的服务器,需要同session判断用户的状态

默认session是存储到服务器的硬盘文件中,不能够共享。

session丢失会造成以下问题:

  • 用户状态无法判断 用户是否登录
  • 验证码没有办法验证 验证码生成值和校验的服务器不再同一个

解决方案:

  • 入库 memcache mysql redis
  • 硬盘共享方式 磁盘共享方式
  • ip_hash hash一致性 让同一个用户访问同一台服务器

十二、安装PHP

Nginx_第53张图片

监听 127.0.0.1的9000端口,当ngxin遇到php文件时,会把这个php的请求转给9000端口的php来处理,nginx本身不能处理php.

1、安装

rz     //上传php-7.0.25.tar.gz到/home/jinnan/tar

image-20200726182108510

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的效果

Nginx_第54张图片

 make && make install

执行完毕效果:

Nginx_第55张图片

2、配置

  1. 安装完成后将php.ini-development 复制到/usr/local/php7.0/etc/php.ini
cp php.ini-development /usr/local/php7.0/etc/php.ini

image-20200726184442332

  1. 给php-fpm服务,创建服务配置文件
cd /usr/local/php7.0/etc

#给php服务,创建服务配置文件
cp php-fpm.conf.default    php-fpm.conf

image-20200726184643731

vim /usr/local/php7.0/etc/php-fpm.conf

#找到如下内容:
;pid = run/php-fpm.pid

#去除;修改为:
pid = run/php-fpm.pid

上述文件是用于保存php服务进程号码的

Nginx_第56张图片

  1. 配置辅助配置文件
cd /usr/local/php7.0/etc/php-fpm.d
cp www.conf.default   www.conf

Nginx_第57张图片

/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

image-20200726185830018

查看php服务进程

netstat -lntp

image-20200726185850241

  1. 设置环境变量,使得在任何地方都可以直接访问php-fpm

vim /etc/profile

在文档最后设置如下内容:

export PATH=/usr/local/php7.0/sbin:$PATH

也可以配置nginx的环境变量

export PATH=/usr/local/nginx/sbin:$PATH

Nginx_第58张图片

使得环境变量立即生效

source /etc/profile

image-20200726190419297

4、修改配置

修改php时区:

vim /usr/local/php7.0/etc/php.ini

Nginx_第59张图片

重启php服务:

image-20200726190636472

5、php与Nginx整合

  1. 编辑文件

/usr/local/nginx/conf/fastcgi.conf

image-20200726212902854

并写入如下内容

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

Nginx_第60张图片

在nihao目录下面新建一个php文件,进行测试。

Nginx_第61张图片

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

Nginx_第62张图片

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

Nginx_第63张图片

你可能感兴趣的:(nginx)