Nginx、CGI、FastCGI、php-fpm关系

NGINX 和 PHP 是一对很好的搭档,那么 nginx 是如何与 php 结合实现 对外的网络访问呢? 首先 NGINX 作为一个 web 服务器只能处理静态请求,关于动态请求,是通过 CGI 具备的动态请求能力。 NGINX会将动态请求交给 CGI 处理,CGI 将处理结果返回给 NGINX,NGINX 再将请求的结果返给给浏览器 CGI 的作用 当在浏览器中输入一个动态地址时,如 /index.php, 通过 DNS 解析,最终请求会到 web 服务器上,当 NGINX 发现请求时动态请求。会交给 PHP 解释器处理此请求,那再给 NGINX 需要给 PHP 解释器传输哪些数据呢?请求地址,请求方法,请求参数这些东西总归是要有的,但是也不能仅仅是这些,像请求头和 cookie … 也应该包含其中。 那么怎么确定到底该传输哪些数据,以及以什么样的格式传输呢? CGI 就是解决这个问题而生的。 CGI 全程通用网关接口 (英语:Common Gateway Interface,CGI) 是为提供网络服务而执行控制台应用的程序,提供于服务器上实现动态网页的通用协议。通常情况下,一次请求对应一个CGI 脚本的执行,生成一个 HTML。 CGI 接口规定了 nginx 与动态解释器之前传输数据的参数和格式,为 nginx 和脚本解释器之间建立起了一个桥梁。 CGI 的存在使 web 服务器与动态语言之间的关系进行了解耦,使得 web 服务器可以处理的动态请求,但是 CGI 的设计使通过进程的方式来处理动态请求的,当动态请求过来后,CGI 会起一个进程进行处理,请求结束后关闭进程. 进程的频繁创建和销毁是存在开销的,这也就导致了 CGI 很难应对高并发的场景, FastCGI 的出现解决了这个问题....

January 12, 2022 · 1 min · 云溪

linux 挂载新盘

当一个新盘挂载的 linux 上,可以通过 fdisk -l 指令,查看挂载的磁盘信息,此时虽然已经挂载到主机上,但是主机还不能正常使用。 要想使用新磁盘,需要经过如下几步: 磁盘分区 磁盘格式化 挂载分区到某个目录 经过上面三部后,就可以使用上新的磁盘了,接下来讲解每一步具体应该如何操作 磁盘分区 $ fdisk -l #查看主机所有的磁盘列表 如上图可以看出 /dev/vda 是新的磁盘并且没有进行分区操作,接下来对 /dev/vda 磁盘进行分区操作 $ fdisk /dev/vda // 进入分区操作,这里要填写你的新磁盘信息,不一定和示例一致 $ m //查看帮助 上图为分区对应的各个操作 $ p #输入 p 查看分区列表 目前并没有划分分区,接下来进行第一个分区的划分 $ n #输入 n 划分分区 $ p # 输入 P 划分为主要分区 接下来需要填写编号(1-4之间)和 磁盘的开始扇区和结束山区 这里由于磁盘不大就没有进行过于细的划分,将所有磁盘容量全部划分到主分区1中 $ w # 输入 w 保存 到此磁盘的划分就已经全部完成,再次输入 fdisk -l 可以看到新划分的主分区 /dev/vda1 格式化磁盘 磁盘划分好后,继续要格式分区,这里使用 ext4 进行格式化 $ mkfs.ext4 /dev/vda1 # 用 ext4 扩展文件系统进行格式化 输入完上述命令后,就可以完成格式化了,如果有报错,请参考常见问题章节解决。...

January 11, 2022 · 2 min · 云溪

服务器公钥登陆

所谓"公钥登录",原理很简单,就是用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求密码。 要实现公钥登陆的前提是需要用户端需要先生成公/私钥对,正常情况下都是有的,目录为:用户目录下的 .ssh 文件夹,私钥没有后缀,公钥后缀为 .pub。 如果没有公私密钥的话可以使用 ssh-keygen 进行生成. 复制代码 ssh-keygen -f test // -f 制定公司钥名称,回车进入下一步 Enter passphrase (empty for no passphrase): // 这里是密钥口令,如果担心私钥安全可以设置一下 Enter same passphrase again: // 确认密钥口令,回车后完成生成 服务器导入公钥 命令行导入 3ssh-copy-id -i ~/.ssh/test.pub user@host 手动导入 通过账号密码登陆服务器,将公钥复制到 ~/.ssh 目录下,执行下方命令: cat RemotePPK.pub >> authorized_keys xshell 使用公钥登陆演示 输入用户名 选择公钥登陆 导入密钥 选择导入好的密钥点 Ok 点击OK 完成登陆

November 2, 2021 · 1 min · 云溪

golang设计模式之单例模式

日常开发中经常会遇到单例模式的使用场景,单例模式可以保证我们初始化出来的结构体只有一个,在一些请求上下文,mysql 连接池..场景经常有着不可估量的作用。 在 golang 开发中,我们应当如何去设计单例模式呢? 常见的错误书写方式 相信如果你对 PHP 写的比较多的情况下经常会写出下面代码一样的单例模式 package main type Singleton struct { } var ins *Singleton func GetIns() *Singleton { if ins == nil { ins = &Singleton{} } return ins } 那上述代码,在正常开发存在什么样的问题呢?上述代码如果用于 PHP 项目是没有任何问题的,因为 PHP 本事是请求隔离的,因而也不会存在并发的问题,但是如果放在常驻内存类型的语言中就会出现并发性不安全问题。 接下来考虑一个场景,在高并发场景下,同时又两个业务都执行到 ins == nil 而此时的 ins 确实没有实例化,那程序将会如何执行呢?答案显而易见,两个业务都会实例化出自己的 ins 结构体,这显然不符合我们的程序预期。 如何解决 golang 标准库sync中找到了Once类型。它能保证某个操作仅且只执行一次。有了他我们就可以很方便的解决并发的问题了接下看看代码示例: package main import "sync" type Singleton struct { } var ins *Singleton var once sync.Once func GetIns() *Singleton { once....

June 19, 2021 · 1 min · 云溪

golang base64 编码与 PHP 输出不一致

最近开发中,将一个 php 算法,移植到 golang 中,发现 base64 算法生成的字符串不一致,经过排查发现是由于 ASCII 控制字符导致的原因,加下来看代码 <?php $asciiArr =[10, 187, 217, 12, 207, 183, 184, 231, 184, 149, 118, 151]; $str = ''; foreach ($asciiArr as $ascii) { $str .= chr($ascii); } echo base64_encode($str); 上述代码输出: CrvZDM+3uOe4lXaX package main import ( "encoding/base64" "fmt" ) func main() { res := []int{10, 187, 217, 12, 207, 183, 184, 231, 184, 149, 118, 151} var str string var b []byte for _, v := range res { str += string(v) b = append(b, byte(v)) } byteCode := base64....

June 16, 2021 · 1 min · 云溪