基于红帽九的高性能web服务器详解!!

目录

一、nginx的源码安装

二、nginx的平滑升级

三、nginx的io调用以及优化

磁盘I/O

网络I/O 

​编辑

阻塞型I/O模型

非阻塞型I/O模型 ​

信号驱动式I/O模型

异步I/O模型

常用I/O模型比较

零拷贝技术

四、nginx启动文件脚本的编写

五、核心配置

全局配置参数的优化调整

root和alias

nginx的用户认证

自定义错误页面

自定义错误日志

检测文件是否存在

长链接配置

下载服务器的配置

六、nginx高级配置

nginx状态页面

​编辑文件压缩功能

变量

七、nginx  rewrite

if指令

set指令

break指令

return指令

企业示例自动跳转https

nginx反向代理

八、FastCGI

php的源码安装

php缓存模块

php高速缓存


一、nginx的源码安装

首先解压nginx安装包

解压完成后进行环境检测

对报错的地方再次进行安装包的安装

检测完成后会有Makefile文件生成

其次使用命令make -jn  n=cpu的核数,将系统中的源文件和c语言头文件进行对接。

运行完成后所有的文件都放在了objs里面,其中nginx是启动文件

src是各种插件和模块

随后将objs文件拷贝到指定文件下

拷贝完成后查看是否有nginx用户,启动nginx后再查看是否有端口和进程

最后进行访问测试,可以看到nginx可以进行访问

把nginx执行路径添加到环境变量中,可以像系统命令一样执行

二、nginx的平滑升级

首先解压并测试nginx1.26版本

然后用make命令生成nginx的执行文件等信息

随后将新生成的文件覆盖至旧的文件中

将旧的worker进程进行回收

随后查看版本更新成功

三、nginx的io调用以及优化

磁盘I/O

    磁盘 I/O 是进程向内核发起系统调用,请求磁盘上的某个资源比如是 html 文件或者图片,然后内核通过相 应的驱动程序将目标文件加载到内核的内存空间,加载完成之后把数据从内核内存再复制给进程内存,如果是比较大的数据也需要等待时间

网络I/O 

1.获取请求数据,客户端与服务器建立连接发出请求,服务器接受请求( 1-3
2.构建响应,当服务器接收完请求,并在用户空间处理客户端的请求,直到构建响应完成( 4
3.返回数据,服务器将已构建好的响应再通过内核空间的网络 I/O 发还给客户端( 5-7
不论磁盘和网络 I/O
每次 I/O ,都要经由两个阶段:
第一步:将数据从文件先加载至内核内存空间(缓冲区),等待数据准备完成,时间较长
第二步:将数据从内核缓冲区复制到用户空间的进程的内存中,时间较短

阻塞型I/O模型

1.阻塞 IO 模型是最简单的 I/O 模型,用户线程在内核进行 IO 操作时被阻塞
2.用户线程通过系统调用 read 发起 I/O 读操作,由用户空间转到内核空间。内核等到数据包到达后,然后将接收的数据拷贝到用户空间,完成read 操作
3.用户需要等待 read 将数据读取到 buffer 后,才继续处理接收的数据。整个 I/O 请求的过程中,用户线程是被阻塞的,这导致用户在发起IO 请求时,不能做任何事情,对 CPU 的资源利用率不够,一个进程只能处理一个请求

非阻塞型I/O模型

 

用户线程发起 IO 请求时立即返回。但并未读取到任何数据,用户线程需要不断地发起 IO 请求,直到数据到达后,才真正读取到数据,继续执行。即 “ 轮询 机制存在两个问题:如果有大量文件描述符都要等,那么就得一个一个的read 。这会带来大量的 Context Switch read 是系统调用,每调用一次就得在用户态和核心态切换一次)。轮询的时间不好把握。这里是要猜多久之后数据才能到。等待时间设的太长,程序响应延迟就过大; 设的太短,就会造成过于频繁的重试,干耗 CPU 而已,是比较浪费 CPU 的方式,一般很少直接使用这种模型,而是在其他IO 模型中使用非阻塞 IO 这一性。
非阻塞:程序向内核发送请 I/O 求后一直等待内核响应,如果内核处理请求的 IO 操作不能立即返回 IO 结果,进程将不再等待,而且继续处理其他请求,但是仍然需要进程隔一段时间就要查看内核I/O 是否完成。

信号驱动式I/O模型

这个模型属于异步非阻塞模型,发送请求后,在内核从硬盘拷贝数据的时候可以接受其他响应,在数据从硬盘拷贝好后,被喊过来处于阻塞状态等待数据拷贝到用户空间中被使用。

异步I/O模型

在获得响应后,内核在向硬盘拷贝数据,再拷贝到用户空间期间可以接受其他相应,当拷贝到用户空间后被信号通知数据准备好了再返回来拿取数据相应。

常用I/O模型比较

零拷贝技术

在用户空间和内核空间实现通道,当内核空间从硬盘上获得数据后不用拷贝传向用户空间,用户空间直接可以看到。把内核的缓存区共享给用户的缓存区使用是关键。

四、nginx启动文件脚本的编写

用命令编写配置文件

配置文件内容

编写完成后停用nginx服务检测一下是否有用

五、核心配置

全局配置参数的优化调整

首先打开配置文件

[root@localhost sbin]# vim  /usr/local/nginx/conf/nginx.conf

在配置文件中修改文件如下

增添cpu核数的配置设置

其次修改最大连接数量

编辑配置文件

在配置文件最后面添加

最终效果

root和alias

#1、添加子配置模块
[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
include "/usr/local/nginx/conf.d/*.conf";
server {
        listen       80;
        server_name  localhost;
#2、创建文件目录
[root@nginx ~]#mkdir -p /www/web/test1
[root@nginx ~]#echo hahahah > /www/web/test1/index.html

#3、配置子文件
[root@nginx sbin]# cat /usr/local/nginx/conf.d/http1.conf 
server {
	listen 80;
	server_name www.abc.com;
	root /www/web;
	location /test1/ {
		root /www/web;
	}
	location /test2 {
		alias /www/web/test1;
	}
}
[root@nginx ~]#nginx -s reload

测试效果

nginx的用户认证

创建默认密码文件

编写主配置文件

效果测试

自定义错误页面

自定义错误页面的目录文件

编写主配置文件

自定义错误日志

access_log   文件地址
error_log   文件地址
注:文件地址需提前创建好

检测文件是否存在

1、编辑子配置文件
try_files  $uri $uri.html $uri/index.html   /文件地址
2、创建文件地址并写入文件
注:写入的文件地址应从server下的root里的文件地址开始

长链接配置

主配置文件(/usr/local/nginx/conf/nginx.conf)添加如下参数:
keepalive_timeout	  :长连接超时时长,0表示禁止连接
keepalive_requests    :长连接数请求发起数量

下载服务器的配置

编辑主配置文件

vim /usr/local/nginx/conf.d/vhost.conf

最后测试

六、nginx高级配置

nginx状态页面

创建一个status的配置文件

配置文件内容如下

在windows中做解析

最终用浏览器访问测试

文件压缩功能

编写nginx主配置文件功能

vim /usr/local/nginx/conf/nginx.conf

创建一个小的文件和一个大的文件

最终结果小的没有被压缩,大的文件被压缩了

变量

内置变量

$remote_addr; #存放了客户端的地址,注意是客户端的公网IP

$args; #变量中存放了URL中的所有参数
#例如:https://search.jd.com/Search?keyword=手机&enc=utf-8
#返回结果为: keyword=手机&enc=utf-8

$is_args#如果有参数为? 否则为空

$document_root; #保存了针对当前资源的请求的系统根目录,例如:/webdata/nginx/timinglee.org/lee。

$document_uri;#保存了当前请求中不包含参数的URI,注意是不包含请求的指令
#比如:http://lee.timinglee.org/var?\id=11111会被定义为/var 
#返回结果为:/var

$host; #存放了请求的host名称

limit_rate 10240;
echo $limit_rate;#如果nginx服务器使用limit_rate配置了显示网络速率,则会显示,如果没有设置, 则显示0

$remote_port;#客户端请求Nginx服务器时随机打开的端口,这是每个客户端自己的端口

$remote_user;#已经经过Auth Basic Module验证的用户名

$request_body_file;#做反向代理时发给后端服务器的本地资源的名称

$request_method;示例:#请求资源的方式,GET/PUT/DELETE等

$request_filename;#当前请求的资源文件的磁盘路径,由root或alias指令与URI请求生成的文件绝对路径,
#如:webdata/nginx/timinglee.org/lee/var/index.html

$request_uri;
#包含请求参数的原始URI,不包含主机名,相当于:$document_uri?$args,
#例如:/main/index.do?id=20190221&partner=search 

$scheme;
#请求的协议,例如:http,https,ftp等

$server_protocol;
#保存了客户端请求资源使用的协议的版本,例如:HTTP/1.0,HTTP/1.1,HTTP/2.0等

自定义变量

设置变量:set  $变量名   值;
引用变量:echo  $变量名;

编写配置文件

[root@nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server {
 listen 80;
 server_name lee.timinglee.org;
 root /webdata/nginx/timinglee.org/lee;
 location /var {
   default_type text/html;
   set $name timinglee;
   echo $name;
   set $web_port $server_port;
   echo $web_port;
 }
}

测试结果

[root@client ~]# curl lee.timinglee.org/var
timinglee
80

七、nginx  rewrite

if指令

if (条件匹配) { 
 action
}
= #比较变量和字符串是否相等,相等时if指令认为该条件为true,反之为false
!= #比较变量和字符串是否不相等,不相等时if指令认为条件为true,反之为false
~ #区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假
!~ #区分大小写字符,判断是否匹配,不满足匹配条件为真,满足匹配条件为假
~* #不区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假
!~* #不区分大小字符,判断是否匹配,满足匹配条件为假,不满足匹配条件为真
-f 和 !-f #判断请求的文件是否存在和是否不存在
-d 和 !-d #判断请求的目录是否存在和是否不存在
-x 和 !-x #判断文件是否可执行和是否不可执行
-e 和 !-e #判断请求的文件或目录是否存在和是否不存在(包括文件,目录,软链接)
#注意:
#如果$变量的值为空字符串或0,则if指令认为该条件为false,其他条件为true。
#nginx 1.0.1之前$变量的值如果以0开头的任意字符串会返回false

set指令

设置变量:set  $变量名   值;
引用变量:echo  $变量名;
[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server {
         listen 80;
         server_name lee.timinglee.org;
         root /webdata/nginx/timinglee.org/lee;
         location /test3{
               set $name lee;
               echo $name;
         }
}
测试:
[root@client ~]# curl lee.timinglee.org/test3
lee

break指令

break 中断当前作用域
[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server {
    listen 80;
    server_name lee.timinglee.org;
    root /webdata/nginx/timinglee.org/lee;
    location /break{
        default_type text/html;
        set $name lee;
        echo $name;
        break;
        set $port $server_port;
        echo $port;
    }
}

测试结果

[root@client ~]# curl lee.timinglee.org/break #当未添加break时
lee
80
[root@client ~]# curl lee.timinglee.org/break #添加break后
lee

return指令

return code; #返回给客户端指定的HTTP状态码
return code [text]; #返回给客户端的状态码及响应报文的实体内容
 					#可以调用变量,其中text如果有空格,需要用单或双引号
return code URL; #返回给客户端的URL地址

编写配置文件

[root@nginx conf.d]# cat return.conf 
server {
	listen 80;
	root /www/web;
	server_name var.nginx.com;
	location /return {
    	 if ( !-e $request_filename ){
      		 return 301 http://www.baidu.com;
      		 #return 666 "$request_filename is not exist";
    	 }
     echo "$request_filename is exist";
  	 }
}

测试结果

[root@client ~]# curl var.nginx.com/return
/www/web/return is exist
[root@client ~]# curl var.nginx.com/return1
/www/web/return1 is not exist

企业示例自动跳转https

新建一个存放证书的地址

生成证书

生成后编写nginx配置文件

重启后测试

nginx反向代理

反向代理至web服务器

[root@nginx ~]# cat /usr/local/nginx/conf.d/valid.conf 
server {
 listen 80;
 server_name var.nginx.com;
 location / {
 	proxy_pass http://192.168.84.150:80;	#指定web服务器的ip
 }
}

指定location实现反向代理

[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhost.conf
server {
 listen 80;
 server_name var.nginx.com;
 location / {
   proxy_pass http://192.168.84.150:80;
 }
 location ~ \.(png|jpg|gif) {
   proxy_pass http://192.168.84.160:8080;
 }
}

八、FastCGI

为什么会有FastCGI?

CGI协议虽然解决了语言解析器和 Web Server 之间通讯的问题,但是它的效率很低,因为 Web Server 每收到一个请求都会创建一个CGI进程,PHP解析器都会解析php.ini文件,初始化环境,请求结束的时候 再关闭进程,对于每一个创建的CGI进程都会执行这些操作,所以效率很低,而FastCGI是用来提高CGI性 能的,FastCGI每次处理完请求之后不会关闭掉进程,而是保留这个进程,使这个进程可以处理多个请 求。这样的话每个请求都不用再重新创建一个进程了,大大提升了处理效率。

什么是PHP-FPM?

PHP-FPM(FastCGI Process Manager: FastCGI进程管理器)是一个实现了Fastcgi的程序,并且提供进程管理的功能。 进程包括master进程和worker进程。master进程只有一个,负责监听端口,接受来自web server 的请求 worker进程一般会有多个,每个进程中会嵌入一个PHP解析器,进行PHP代码的处理。

php的源码安装

首先下载解压块文件,解压nginx-1.26.2文件,添加一下模块

完成后查看版本信息

解压php压缩包并且进行环境监测

解析完毕后用命令make && make install 来cp文件

编写主配置文件

修改时区

编写启动文件注释挂载

php启动成功

php缓存模块

编写配置文件

安装memcached

[root@Nginx ~]# tar zxf memcache-8.2.tgz
[root@Nginx ~]# cd memcache-8.2/
[root@Nginx memcache-8.2]# yum install autoconf
[root@Nginx memcache-8.2]# phpize
[root@Nginx memcache-8.2]# ./configure && make && make install

复制测试文件至nginx访问目录

[root@Nginx ~]# cd memcache-8.2/
[root@Nginx memcache-8.2]# ls
autom4te.cache config.log     configure.ac example.php Makefile.fragments 
README
build           config.m4     config.w32   include     Makefile.objects runtests.php
config9.m4
    config.nice   CREDITS       libtool     memcache.la         src
config.h       config.status docker       LICENSE     memcache.php       
tests
config.h.in     configure     Dockerfile   Makefile     modules
[root@Nginx memcache-8.2]# cp example.php memcache.php /data/php/
[root@Nginx ~]# vim /data/php/memcache.php
define('ADMIN_USERNAME','haha');   //账号
define('ADMIN_PASSWORD','123456');   // 密码
define('DATE_FORMAT','Y/m/d H:i:s');
define('GRAPH_SIZE',200);
define('MAX_ITEM_DUMP',50);
$MEMCACHE_SERVERS[] = 'localhost:11211'; // add more as an array
#$MEMCACHE_SERVERS[] = 'mymemcache-server2:11211'; // add more as an array

部署memcached

[root@Nginx ~]# yum install memcached -y
[root@Nginx ~]# systemctl enable --now memcached.service

[root@Nginx ~]# netstat -antlupe | grep memcache
tcp       0     0 127.0.0.1:11211         0.0.0.0:*               LISTEN     
976       1037243   186762/memcached

[root@Nginx ~]# cat /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 127.0.0.1,::1"

php高速缓存

[root@Nginx ~]#cat /usr/local/nginx/conf.d/php.conf
upstream memcache {
   server 127.0.0.1:11211;
   keepalive 512;
}
server {
 listen 80;
 server_name php.timinglee.org;
 root /data/php;
 location /memc {
   internal;
   memc_connect_timeout 100ms;
   memc_send_timeout 100ms;
   memc_read_timeout 100ms;
   set $memc_key $query_string; #使用内置变量$query_string来作为key
   set $memc_exptime 300; #缓存失效时间300秒
   memc_pass memcache;
 }
 location ~ \.php$ {
 set $key $uri$args; #设定key的值
   srcache_fetch GET /memc $key; #检测mem中是否有要访问的php
   srcache_store PUT /memc $key; #缓存为加载的php数据
   fastcgi_pass 127.0.0.1:9000;
   fastcgi_index index.php;
   include fastcgi.conf;
 }
}
[root@Nginx ~]# systemctl start nginx.service

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值