Web services nginx+php

Mac homebrew搭建php nginx apache mysql环境 macOS php nginx apache mysql 多版本 阅读详情

Reference:

http://blog.youkuaiyun.com/tuantuanls/article/details/41288311

 

深入浅出web服务 

标签: http服务器http协议web服务
  1623人阅读  评论(0)  收藏  举报
  分类:

目录(?)[+]

对于没有做过web开发的人来说,web开发涉及到的名词似乎特别多,apache,nginx,cgi,php,http,cookie,session。这一大坨东西到底是什么,这里我们就从网络的层面去理清楚这些东西。

1. 什么是HTTP

对于web来说贯穿始终的东西就是HTTP,那么什么是HTTP?官方说法就是Hyper Text Transfer Protocol,从这个名字上面还判断,HTTP是一种协议,并且是一种应用层协议,其对应的传输层协议TCP。所以说到底,HTTP就是建立在TCP基础上的一种应用层协议。


所以简单点说,就是客户端发起连接,然互通过tcp发过来一个数据报,服务器处理以后再回复一个数据报,并关闭连接。这样一次http请求就结束了。所以最初的http模型是一次请求对应一次连接,也就是我们经常看到的,http无状态的特点。

1.1 数据报的格式

根据上面说的过程,就需要在服务器和客户端之间规定一种格式,双方都按照这种格式来解包,http规定的协议格式如下:


用任何一个抓包工具都能看到一个包的全貌,比如头部字段名会包括Accept, Accept-Encoding, Accept-language, cache-control, connection, cookie, host, user-agent等。

而服务器回复的数据报一定含有一个status code,包头包含cache-control, connection, content-encoding, content-type, date, pragma, server, setcookie, transfer-encoding等字段。

后面会挑几个有意思的字段进行说明。

1.2 HTTP之COOKIE

先说cookie。cookie是用来做什么的呢?我们知道http协议本身是说每一次请求都是无状态的,即两次请求之间没有任何逻辑上的关联,http server不知道第二次请求和第一次请求是否来自同一个client。但是作为一个web应用无状态是肯定不满足需求的,一个最典型的例子就是用户的登录态,我们不能要求每次用户想要获取一个页面的时候都重新登录,所以需要一些机制来记录这些状态,cookie和session是最基本的解决方案。

cookie是由浏览器来管理的,其一般保存在客户端内存中,所以生命周期为浏览器会话期间,关闭浏览器以后,cookie会自动消失。当然如果cookie设置了过期时间,也会由浏览器同步在磁盘当中。在每次http请求的过程当中,浏览器会按照一定的原则选择一部分cookie放在http包头当中发给web服务器。所以cookie过长导致的直接结果就是http包体过大,因此http协议对cookie的长度是有限制的。

如何修改cookie呢?我们经常能看到用js或者php来修改cookie的sample code。用js来修改cookie是比较直观的,因为cookie由浏览器来管理,js也是由浏览器来解析的。但是为什么php作为server side的script也能修改cookie呢?就是因为http回包中的set-cookie这个字段,通过这个字段可以告诉浏览器需要修改cookie的哪些字段。

既然提到cookie,就一起说一下session。session也是为了实现状态保存而设计的机制,只是它是存在服务器端的而已。session可以看做是服务器端的一个hash表,默认是以文件的形式存储的,这个hash表的key就是session id,session id会保存在cookie当中,所以每次服务器解开http包以后,根据cookie中的session id就可以在hash表中数据。那么问题就来了,如果用户在浏览器禁掉了cookie,是不是就找不到session了呢?当然不是,仅仅是禁掉cookie还有很多其他的方式可以将其拼在http包当中传回来呀,可以放在包头的其他字段里比如说get参数,也可以放在包体当中,例如post参数,这种事情是不能难倒程序员的

1.3 HTTP之长/短连接

在http1.0当中是没有connection这个字段的,因为在http1.0当中还是一次请求对应一次连接的,即在服务器发出相应以后会主动断开连接。这样会

而在http1.1版本中增加了connection这个字段,并且默认值是keep-alive。它还有一个值是close。keep-alive就是告诉对方这次请求的方式是长连接,即发送相应包以后不要断开连接,即使是错误响应也不要断开连接。

举个例子:

Request

  • connection: keep-alive表示这次请求过后请不要断开连接
  • connection: close表示这次请求后请断开连接

Response

  • connection: keep-alive这次请求以后我不会断开连接
  • connection: close 这次请求以后我会断开连接。

所以说到底request和response当中只要有一个close,就意味着这次请求以后连接会断开。当第一个request和response对都是keep-alive的时候,一个长连接就建立了,这个时候客户端就可以采用pipeline的方式向server来发包了,pipeline方式指的是client无需等待回应而持续性的发送请求,server会按照request的顺序来回复。

长连接带来了新的问题。

1.3.1 超时保护

如果连接建立以后一直处于inactive的状态怎么办?浪费了server一个fd和client的端口。所以需要有超时保护机制,例如在nginx当中可以配置其keepalive_timeout的值。http协议并没有规定server和client的超时时间,可以由开发者任意指定。

1.3.2 分包协议

在短连接模式的时候,由于每次server响应后直接关闭连接,所以client的短只需要判断EOF来判断response包是否结束。而对于keep alive模式,继续用这种方式会极大降低效率。所以引入了content-length和transfer-encoding两个字段。

1.4 HTTP之数据报结束符

当客户端请求一个服务器的静态资源时,服务器清楚响应的消息长度,所以可以用content-length字段告诉client响应数据的长度。

然而如果请求的是一个动态网页,服务器预先是不可能知道相应包的长度,所以可以才用transfer-encoding: trunked模式来传递数据,即一边产生数据一边发送。一次相应由多个trunk构成,最终由一个长度为0的trunk标记结束。每个trunk是一个数据块,在trunk头标记了当前数据块的长度。

2. 什么是Apache和Nginx

如果他们作为http server(当然还有其他的feature),比较简单地理解就是他们是对http协议的一种实现,例如nginx的HTTP模块基本就是按照HTTP协议的RFC文档,把各种情况cover一遍。简单点说,即解包->过滤->转包->过滤->拼包,下图是nginx的一个简要示意图。


3. 一般的web架构是怎样的


上图是一个常见的web架构,由反向代理服务器,http服务器组成,http服务器又分成nginx进程和php进程。

首先,暴露给用户的是一个反向代理服务器,反向代理的存在有几个作用,一是负载均衡,反向代理服务器收到数据包以后会按照一定的负载均衡算法转发到真正的业务服务器上面去,另一个作用是防止攻击,它会按照一定的规则过滤掉很多不合法的请求,从而降低业务机的负载,因为其只是简单地转发,没有真正的业务逻辑,所以即使黑客攻击到了这一层也没有太大的危害。同时反向代理服务器也可以缓存一些静态的资源,进一步降低业务机的负载。

nginx作为http服务器,在整个架构中主要负责hold连接,并不做请求的真正处理,在上图中被画成了一个方块,但其本身也是多进程的结构。


假如对同一台机器上面配置了8个nginx worker,每个worker配置的连接数是1024,那么这台机器hold连接的能力大概是8*1024。

nginx worker和php-fpm的通信方式是通过socket来通信的,所以说nginx和php-fpm可以部署在同一台机器上也可以部署在不同的机器上。

php-fpm是php的一个插件,现在已经集成到了php的核心代码中,是fast-cgi的一种实现。其进程结构和nginx基本类似,都是由一个master进程和多个worker进程构成的。fastcgi规定每过来一个请求,都从进程池里挑选一个进程,来加载并执行一段php脚本,脚本结束以后将进城归还给进程池。所以php-fpm说到底就是一个进程管理器,正如其名字所示(FastCGI Process Manager)。

php-fpm对于其worker进程数的配置由两种static和dynamic。若配置成static表示在fpm启动的时候由master直接fork出max_children的worker数,并且在运行当中这个数字是不变的。而dynamic则表示根据具体的请求动态的fork worker进程,最大值为max_children。那么,这个max_children该如何配置呢?如果worker数过少,那么php-fpm收到nginx的数据请求时发现进程池里面已经没有进程了,直接就会拒绝服务,导致此次http请求以502告终。如果max_children配置过多的话,会占用多余的系统资源,尤其是在static情况下。所以比较适中的办法就是将这个值先配得大一些,然后去观察active的进程数,最后选择一个合适的值。

我们可以看到在fastcgi模式下,一个进程是对应一个请求的,假如说在一台机器上我们配置了300个fastcgi进程,那么其能同时处理的最大请求数就是300个,是远远小于nginx的接入能力的。如果php有一些阻塞调用(如文件上传下载等),当前进程不能处理其他的请求,所以说php-fpm在在这套架构里是瓶颈,如何在此提高性能是一个值得探讨的问题。

当浏览器出现一个错误页或者白页的时候,有可能是任何一个环节出现问题。这就要慢慢的查了。


Laravel本地开发环境:Docker Compose一键搭建Nginx+PHP+MySQL Docker Compose 是现代 Web 开发中实现环境标准化的关键工具,它通过声明式 YAML 文件编排多容器应用,解决传统 LAMP 栈常见的版本冲突、端口抢占与环境漂移问题。其核心原理在于利用 Docker 的隔离性与镜像确定性,将 Nginx(反向代理与静态服务)、PHP-FPM(应用运行时)和 MySQL(持久化存储)解耦为独立可配置服务,并通过自定义网络与卷挂载实现安全通信与数据持久。该方案显著提升 Laravel 项目在 Ubuntu、WSL2、Mac M1 等异构宿主上的可复现性与团队协 阅读详情

相关推荐

两节点LEPP架构:CentOS 7上Nginx+PostgreSQL+PHP生产部署指南

LEPP(Linux+Nginx+PostgreSQL+PHP)是一种面向中型业务的轻量级生产架构范式,强调Web与数据库的物理隔离、故障域收敛与ACID严格保障。其核心原理在于通过网络分层解耦服务职责,利用PostgreSQL的JSONB、行级锁和扩展生态替代MySQL,结合Nginx反向代理与PHP-FPM进程模型实现高并发可控调度。技术价值体现在资源利用率提升、运维可观测性增强及安全边界清晰化;典型应用场景包括SaaS进销存、教育平台后端、API优先型Web系统等日均5万PV以上的中负载环境。本文聚焦

weixin_30851867的博客 283

Web服务器解析漏洞攻防详解:从Apache、Nginx到IIS的实战剖析

Web服务器解析漏洞是网络安全领域的经典议题,其核心原理在于服务器在文件类型识别与执行逻辑之间出现错配。当服务器错误地将用户上传的恶意文件(如图片)当作可执行脚本(如PHP、ASP)处理时,攻击者便能绕过常规防御,执行任意代码,从而控制服务器。这种漏洞不依赖复杂技术,却危害巨大,常被用于上传WebShell、获取服务器权限。在实战中,Apache的多后缀解析机制、Nginx的路径解析缺陷以及IIS的分号截断漏洞都是典型代表。理解并防御解析漏洞,是构建Web安全纵深防御体系的基础,涉及服务器安全配置、严格的上

areen7003的博客 383

PHP 8.4 FPM + Nginx Docker 镜像构建:3层优化策略将镜像体积缩减40%

本文详细介绍了如何通过三层优化策略将PHP 8.4 FPM与Nginx组合的Docker镜像体积缩减40%。从基础镜像选择、多阶段构建到依赖管理与扩展优化,再到Nginx集成与最终优化,提供了全面的实践指南,帮助开发者提升部署效率并降低云服务成本。

weixin_34301132的博客 340

HTTP协议:分块编码Trunked

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33989058的博客 640

Nginx架构及配置详解

概述 Nginx采用C进行编写,是俄罗斯程序员开发的一款轻量级的可构建Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器的软件, Nginx服务器是一个高性能的HTTP和反向代理web服务器,同时也可提供了IMAP/POP3/SMTP服务。nginx常用作跑静态和做负载反向代理,动态php交给apache处理,因后者比较稳定,jsp交给tomcat、resin或jboss。n......

企业实战系列集 ●●● https://ximenjianxue.blog.youkuaiyun.com 7071

UE5.3像素流送Docker化部署:从Linux服务器搭建到云端实时渲染

本文详细介绍了在Linux服务器上使用Docker容器化部署UE5.3像素流送服务的完整流程。通过将虚幻引擎运行时、信令服务器和TURN服务打包为标准化镜像,利用Docker Compose进行编排,实现了云端实时渲染应用的快速部署、环境一致与弹性扩展,有效解决了传统部署中的环境依赖与运维难题。

k0l1m2n3o的博客 200

Http Trunked协议使用

1. 为什么要使用Http Trunked协议? 一般http通信时会使用content_length头信息来表示服务器发送的文档内容长度,这是因为我们已经提前知道了文档内容的长度,但 有时候我们无法提前知道我们需要传输的文档的长度,这时我们就要采用分块传输的方式来发送内容,也就是通过我们的http trunked协议。 Http1.1x协议的chunked编码方式,可以确保接...

weixin_34014555的博客 822

设计的多实例引用(Multiple Instances of a Design Reference)

一、什么是“设计的多实例引用” 在层次化的设计中,我们经常会将一个module例化多份,这些例化的instance就是设计的module的多实例引用。 二、为什么要解决多实例引用 三、怎么解决多实例引用 ...

kevindas的博客 3719

java trunked_Http Trunked协议使用

1. 为什么要使用Http Trunked协议?一般http通信时会使用content_length头信息来表示服务器发送的文档内容长度,这是因为我们已经提前知道了文档内容的长度,但有时候我们无法提前知道我们需要传输的文档的长度,这时我们就要采用分块传输的方式来发送内容,也就是通过我们的http trunked协议。Http1.1x协议的chunked编码方式,可以确保接收端能够准确的判断不定长...

weixin_29745227的博客 469

Duilib的简单使用(五、DuiDesigner/DuiEditor的下载编译)

一、前言 在Duilib的简单使用(一、duilib demo)中我们介绍了利用duilib简单的构造一个项目 在Duilib的简单使用(二、xml实现界面与业务分离)中我们介绍了XML在duilib中的使用 在Duilib的简单使用(三、界面逻辑交互)中我们已经知道如何简单的进行界面的交互 在Duilib的简单使用(四、换肤)中,我们提了一下Duilib强大的一键换肤功能。 通过之前的说明,我们知道duilib是通过xml来分离界面和业务逻辑的,但是xml如果不能预览,那每次敲一个再运行一下看看效果,这不

LyRics1996的博客 2888

PythonWeb开发框架—Django之工程创建和models的定义和增删改查

文章介绍了Django工程的创建、models的定义和增删改查

weixin_42476668的博客 990

HTTP1.1中CHUNKED编码解析

一般HTTP通信时,会使用Content-Length头信息性来通知用户代理(通常意义上是浏览器)服务器发送的文档内容长度,该头信息定义于HTTP1.0协议RFC  1945  10.4章节中。浏览器接收到此头信息后,接受完Content-Length中定义的长度字节后开始解析页面,但如果服务端有部分数据延迟发送吗,则会出现浏览器白屏,造成比较糟糕的用户体验。 解决方案是在HTTP1.1协议中,

学海无涯 1112

YOLO26改进 - C2PSA | C2PSA融合DiffAttention差分注意力:轻量级差分计算实现高效特征降噪,提升模型抗干扰能力

本文介绍了 DiffCLIP,一种将差分注意力机制集成到 CLIP 架构的视觉 - 语言模型,并将其应用于 YOLO26。差分注意力机制通过计算两个互补注意力分布的差值,抵消无关信息干扰。单头差分注意力将 Q 和 K 拆分,分别计算注意力分布后做差值融合;多头差分注意力则每个头独立执行差分操作后聚合输出。关键参数 λ 可动态调控噪声抵消强度。我们将 DiffAttention 代码集成到 YOLO26 中,替换原有模块。实验表明,改进后的 YOLO26 在图像 - 文本理解任务中表现出色。

魔改工程师的博客 602

对http相应中trunked的解析

import java.io.IOException; import java.io.InputStream; import java.net.Socket; public class SocketRequest { // 从指定的Socket的InputStream中读取数据 private InputStream input; private String uri;

silence1214的专栏 3444

WPF中使用TreeView封装组合控件TreeView+DataGrid

wpf的功能非常强大,很多控件都是原生的,但是要使用TreeView+DataGrid的组合,就需要我们自己去封装实现。功能如上图所示, 目前基本上把常用的样式都实现了,购买源码后,可以自行修改样式。本文源码效果如下,(搞了好几天,的确有难度,所以源码也收费,便宜,赚点辛苦费)第一种:技术的选择是TreeView(也就是本文的演示)。这2个图都是第三方控件自带的,并且都是收费使用。首先说明一下,实现上面的效果,有3种方法。本文演示的是使用TreeView的实现。第二种:技术的选择是DataGrid。

故里2130 1650

【ESP 保姆级教程】玩转emqx数据集成篇④ ——数据桥接之HTTP服务

主要是学习数据桥接功能以及构建自己的http服务器,这是一个非常有用的功能。包括各种传感器上报基本上都需要数据桥接功能支持,所以还是希望认真学习这一块开发,然后结合数据库存储等等知识点进行进一步学习。

单片机菜鸟哥的博客 1307

php 5.4 aws,2018最新版零基础 Amazon Web Services (AWS) 入门教程(4)--EC2中搭建PHP环

摘要:上一章接:2018最新版零基础 Amazon Web Services (AWS) 入门教程(3)--启动MySQL数据库-RDS目录* 注册AWS账号* 启动一个虚拟云服务器-EC2* 启动一个MySQL数据应用-RDS* EC2中搭建PHP环境(本文讲此章)* PHP环境下安装zb目录* 注册AWS账号* 启动一个虚拟云服务器-EC2* 启动一个MySQL数据应用-RDS* EC2中搭建...

weixin_42321075的博客 271

Open3D 计算点云模型的表面积和体积【2025最新版】

python编程实现 计算点云模型的表面积和体积,博客长期更新,本文最近一次更新时间为:2025年4月4日。

点云侠的博客 13万+

nginx服务器缓存文件清理,清除nginx缓存文件并不总是有效

我运行nginx服务器+ PHP webservices API。我使用nginx的fastcgi_cache来缓存所有的GET请求,当某些资源更新时,我清除一个或多个相关的缓存资源。清除nginx缓存文件并不总是有效我正在使用的方法是为我要清除的每个资源计算nginx缓存文件名,然后删除该文件。大多数情况下,这很有效。但是,我发现有时,即使删除缓存文件后,nginx仍会从缓存中返回数据。这不是选...

weixin_30716641的博客 2452

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

如何快速部署Chamilo LMS:5个步骤完成专业学习管理系统配置

Chamilo LMS是一个专注于易用性和可访问性的开源学习管理系统,采用GNU/GPLv3+许可证发布。自2010年创立以来,全球已有超过4000万用户使用这个功能强大的在线教育平台。本指南将带你完成Chamilo学习管理系统的完整部署流程,从环境准备到高级配置优化。 ## 🚀 环境准备与系统要求 在开始部署Chamilo学习管理系统之前,需要确保服务器满足以下要求: ### 硬件要求

gitblog_00194的博客 381

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

PHP - PHP-FPM - 学习/实践

本文摘要: 文章主要探讨了Nginx+PHP-FPM的运行机制、配置优化与实践应用。首先介绍了PHP-FPM作为PHP FastCGI进程管理器的工作原理,对比了CGI与FastCGI的区别,强调FastCGI通过主进程管理worker进程提升性能。详细解析了php-fpm.conf配置文件结构及核心参数,包括进程管理、日志设置等。同时展示了Nginx与PHP-FPM的协同配置,特别是虚拟主机多站点部署。文中还讨论了PHP-FPM的进程模型(master+worker)、平滑重启方法,以及常驻内存特性与Sw

"代码"的日常搬运 2290

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Android 手机的高级终端 Termux 安装使用、busybox、安卓 手机 web

手机已经 root安装 tsu,这是一个 su 的 Termux 版本,是一个真正的 root 权限,用来在 Termux上替代su,操作不慎可能对手机有安全风险,因为官方封装了,所以安装也很简单:安装 tsu:pkg install tsu -y切换到 root:tsu退出 root:exittsu切换 root 用户时会弹出 root 授权提示,给予其 root 权限即可。在管理员身份下输入 exit 可回到普通用户身份。

freeking101的博客 10万+

tangramor/nginx-php8-fpm 镜像实战:Laravel 11 生产部署 5 步配置指南

本文详细介绍了如何使用 tangramor/nginx-php8-fpm 镜像进行 Laravel 11 的生产级容器化部署。通过5步配置指南,包括定制化镜像选择、Dockerfile构建、Docker Compose编排、性能调优和安全加固,帮助开发者高效部署Laravel应用。特别针对PHP8和Nginx的优化配置,确保生产环境的高性能和安全性。

aikb6223的博客 387

Cockpit 安装部署全攻略:Docker、Nginx 与 PHP 8.3 环境一步到位

Cockpit 安装部署其实比想象中简单:它是一个轻量、灵活的无头内容管理平台(Headless CMS),官方推荐用 Docker 一键启动,也可以搭配 Nginx 与 PHP 8.3 传统部署。本攻略将带你走完从环境检查、Docker 部署、Nginx 伪静态配置到完成安装向导的全部流程,新手也能一次跑通,生产环境同样适用。 ## Cockpit 是什么:为内容而生的无头 CMS Cock

gitblog_00044的博客 243

利用Nginx+uwsgi进行python web项目部署

因为工作过程中没有很用心的去记部署的这些细节,然后凑巧看到一篇比较全面的帖子后决定粘下来,防止以后再忘记这些细节的时候有地方可查。转载自:https://segmentfault.com/a/1190000016108576 Django+uWSGI+nginx 部署 django 一个pyhton的开源web框架。 uWSGI 一个基于自有的uwsgi协议、WSGI协议和http服务...

weixin_42255200的博客 721

linux下搭建nginx+uwsgi+web.py的python web服务器

前提声明:    python开发web,就现阶段的本人认知来收,还不是很成熟和优势鲜明,同样是脚本开发,开发便利性不如php,企业级开发不如java。唯一的优势就是类库基数大,基本上什么库都找得到,还有就是语法比较优美,仅此而已。而且在国内的应用也比较少和局限,大部分人还是用python来做运行性的脚本。   所以本文仅止于浅显地探讨一下python如何在linux下进行web开发,如何深入

无效的博客 8403
上一篇: SQLite vs MySQL vs PostgreSQL
下一篇: docker vs rtk
screaming
博客等级 码龄19年 61粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值