赞
踩
1.客户端(浏览器)做出请求操作(输入网址、点击链接、提交表单)
2.客户端检测缓存
1)有缓存且较新,客户端直接读取本地缓存进行资源展示
2)有缓存但是不新,准备http请求包,发送至服务端进行缓存校验
3.客户端对域名进行解析,向设定的 DNS 服务器请求 IP 地址。
1)DNS 全称是 Domain Name System,译为域名系统。它可以将域名和 IP地址互相映射,能够让用户使用域名就可以访问互联网服务。
4.客户端根据 DNS 服务器返回 IP 地址采用三次握手与服务端建立 TCP/IP 连接。
1)TCP/IP 协议是一种面向连接的、可靠的、基于字节流的运输层通信协议,是全双工模式
全双工模式:指可以同时(瞬时)进行信号的双向传输(A→B且B→A)。指A→B的同时B→A,是瞬时同步的。
半双工模式:指一个时间内只有一个方向的信号传输(A→B或B→A)。
举例说明其原理:一座桥的两头分别有车要过桥,如果桥比较宽,就可以来左去右,互不影响,这就是全双工;如果桥窄,只能先过一边的车,然后再过另一边的车,这就是半双工。
5.服务端的Web Server会判断HTTP请求的资源类型,进行内容分发处理。如果请求的资源为 PHP 文件,服务端软件会通过 PHP-FPM 启动对应的 CGI 程序进行处理,并返回处理结果。
6.服务端将 Web Server 的处理结果响应给客户端
7.客户端接收服务端的响应,并渲染处理结果,如果响应内容需要请求其他静态资源,可以直接访问或通过 CDN 加速访问所需静态资源。
8.客户端将渲染好的视图呈现出来并采用四次分手断开 TCP/IP 连接
当客户端向服务端发出请求时,它向服务端传递一个数据块,即请求信息,HTTP 请求信息由三部分组成:
HTTP Request Line(HTTP 请求行)
HTTP Request Header(HTTP 请求头)
HTTP Request Body(HTTP 请求正文)
HTTP 请求行
HTTP 请求头
HTTP 请求正文
服务端在接收和解释请求消息后,服务端会返回一个 HTTP 响应消息。HTTP 响应也由三个部分组成,分别是:
HTTP Response Line(HTTP 响应行)
HTTP Response Header(HTTP 响应头)
HTTP Response Body(HTTP 响应正文)
HTTP 响应行
HTTP 响应头
HTTP 响应正文
当服务端接收 HTTP 请求后,服务端的服务器软件,如 Apache、Nginx 则会根据配置处理 HTTP 请求进行分发处理。如果客户端请求的是 index.html 文件,那么 Web Server 会根据配置文件去对应目录下找到这个文件,然后让服务端发送给客户端,这样分发的是静态资源。如果客户端请求的是 index.php 文件,根据配置文件,Web Server 会去找 PHP 解析器来处理。
当 PHP 解析器收到 index.php 这个请求后,会启动对应的 CGI 程序,PHP-CGI 程序就是 PHP 对 CGI 协议的程序实现了。PHP-CGI 程序会解析 php.ini 文件,初始化执行环境,然后处理请求,再以 CGI 规定的格式把结果返回给 Web Server,接着 Web Server 再把结果返回给客户端。
Module:PHP Module 加载方法。
PHP-CGI:PHP 对 Web Server 提供的 CGI 协议的接口程序。
PHP-FPM:PHP 对 Web Server 提供的 FastCGI 协议的接口程序,额外提供了相对智能的任务管理。
以上三种实现方法本质都是通过 PHP 的 SAPI 层调用 PHP 执行的。
Module
LoadModule php7_module /usr/local/opt/php70/libexec/apache2/libphp7.so
<FilesMatch .php$>
SetHandler application/x-httpd-php
</FilesMatch>
<IfModule dir_module>
DirectoryIndex index.php index.html
</IfModule>
这种方法,本质上是使用 Apache 的 LoadModule 来加载 php7_module,也就是把 PHP 作为 Apache 一个子模块来运行。当客户端请求 PHP 文件时,Apache 就会调用 php7_module 来解析 PHP 代码。
这种模式将 PHP 模块安装到 Apache 中,每一次 Apache 接收请求时,都会产生一条 Apache 进程,这条进程就完整的包括 PHP 的运算计算,数据读取等各种操作。
由于每次请求都需要产生一条进程来连接 SAPI 来完成请求,一旦并发数过高,服务端就会承受不住。而且把 php7_module 加载进 Apache 中,出现问题时很难定位是PHP 的问题 还是 Apache 的问题。
在了解 PHP-FPM 之前,我们先来了解一下 FastCGI。
从根本上来说,FastCGI 是用来提高 CGI 程序性能的。类似于 CGI,FastCGI 也可以说是一种协议。
FastCGI 像是一个常驻(long-live)型的 CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去 fork 一次。它还支持分布式的运算, 即 FastCGI 程序可以在网站服务器以外的主机上执行,并且接受来自其它网站服务器来的请求。
FastCGI 是语言无关的、可伸缩架构的 CGI 开放扩展,其主要行为是将 CGI 解释器进程保持在内存中,并因此获得较高的性能。众所周知,CGI 解释器的反复加载是 CGI 性能低下的主要原因,如果 CGI 解释器保持在内存中,并接受 FastCGI 进程管理器调度,则可以提供良好的性能、伸缩性、Fail- Over 特性等等。
FastCGI 接口方式采用 C/S 结构,可以将 Web Server 和脚本解析服务器分开,同时在脚本解析服务器上启动一个或者多个脚本解析守护进程。当 Web Server 每次遇到动态程序请求时,可以将其直接交付给 FastCGI 进程来执行,然后将得到的结果返回给浏览器。这种方式可以让 Web Server 专一地处理静态请求,或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。
PHP-FPM 是对 FastCGI 协议的具体实现,它负责管理一个进程池,来处理 Web Server 的请求。它自身并不直接处理请求,它会交给 PHP-CGI 去进行处理。因为 PHP-CGI 只是一个 CGI 程序,它只会解析请求,返回结果,不会管理进程。PHP-FPM 是用于调度管理 PHP 解释器 PHPCGI 的管理程序。
PHP-FPM 优劣势分析与解决方案
PHP-FPM 的优势有许多,如实现了 FastCGI 协议来处理 HTTP 请求,有着更高的性能和更小的开销。每当 PHP-FPM 的子进程处理完 HTTP 请求后,相关资源自动销毁,不用担心资源回收的问题。哪怕在运行的过程中报错了,也不影响其他子进程的运行,使得开发者不用过分担心未知的错误而进行面面俱到的防御性编码。在低负载时硬件开销低,只需要 fork 多几个子进程就满足日常访问量。
PHP-FPM 的劣势也很明显。首先是不适合高并发和高负载的场景。因为在高负载的情况,由于 PHP-FPM 多进程模型,会显得子进程的初始化开销过高。加上进程、文件句柄、请求连接等,会使得内存过多地消耗,而 CPU 也得不到充分的利用。又因为子进程的开销过高,导致服务器的内存容易饱满,使得网络连接数过低。由于 PHP-FPM 在完成请求会自动销毁资源,因此也不支持 Websocket 或其他长连接协议。
Apache HTTP Server(简称Apache)是 Apache 软件基金会的一个开放源代码的网页服务器软件,可以在大多数电脑操作系统中运行,由于其跨平台和安全性被广泛使
用,是最流行的Web服务器软件之一。它快速、可靠并且可通过简单的API扩充,将 PHP/Perl/Python 等解释器编译到服务器中。
Apache 常用命令
Options(配置选项)
Laravel .htaccess 文件的 URL rewrite 示例配置
<IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews </IfModule> RewriteEngine On # Redirect Trailing Slashes If Not A Folder... RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)/$ /$1 [L,R=301] # Handle Front Controller... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] </IfModule> 配置虚拟主机的 httpd-vhosts.conf 文件的示例配置 <VirtualHost *:80> ServerName cowcat.app ServerAdmin cowcat.app ServerAlias www.cowcat.app DocumentRoot "/Users/LuisEdware/Code/WorkSpace/CowCat/public" ErrorLog "/Users/LuisEdware/Code/Errors/cowcat.app-error_log" CustomLog "/Users/LuisEdware/Code/Errors/cowcat.app-access_log" common </VirtualHost>
Nginx 是一款面向性能设计的HTTP服务器,相较于 Apache、lighttpd 具有占有内存少,稳定性高等优势。与旧版本(<=2.2)的 Apache 不同,Nginx 不采用每客户
机一线程的设计模型,而是充分使用异步逻辑,削减了上下文调度开销,所以并发服务能力更强。整体采用模块化设计,有丰富的模块库和第三方模块库,配置灵活。 在
Linux 操作系统下,Nginx 使用 epoll 事件模型,得益于此,Nginx 在 Linux 操作系统下效率相当高。
Nginx 常用命令
Nginx 的模块从功能角度主要可以分为以下三类:
Handler 模块
Filter 模块
e 模块。
Nginx 常见的配置指令如下:
配置示例
server{ listen 80; server_name october.com www.october.com; # 日志记录 acomess_log /log/nginx/october.acomess.log main; error_log /log/nginx/october.error.log; location / { root /data/public; try_files $uri $uri/ /index.php?$query_string; index index.php index.html index.htm; } #PHP 脚本请求全部转发到 FastCGI 处理. 使用 FastCGI 默认配置. location ~ \.php$ { root /data/public; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
反向代理
server {
listen 80;
server_name gogs.october.com;
location / {
proxy_pass http://localhost:3000;
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。