Nginx + fastCGI 实现动态网页部署
简介
- 本文章主要介绍下,如何通过Nginx + fastCGI来部署动态网页。
CGI介绍
- 在介绍fastCGI之前先介绍下CGI是什么。
- CGI : Common Gateway Interface,公共网关接口。在物理层面上是一段程序,运行在服务器上,提供同客户端HTML页面的接口。
- Nginx+CGI处理步骤
- 用户发送HTTP请求到Web服务器
- Web服务器fork一个CGI子进程,将用户请求交给CGI程序
- CGI程序把处理结果传送给Web服务器,CGI子进程被销毁
- Web服务器把结果返回到用户
- CGI缺点
- CGI每处理一个请求,就要fork一个子进程,处理完请求,再销毁子进程。频繁的创建和销毁进程,就会大大降低Web服务器的效率。
- fastCGI
- fastCGI是对CGI的优化,fastCGI并不会每处理一个请求就创建一个进程, 这样就避免了频繁创建和销毁CGI进程,可以大大提高服务器的效率。
- 下面就重点介绍下fastCGI
fastCGI
- FastCGI是一个可伸缩的、高速的在HTTP服务器和动态脚本语言间通信的接口,主要优点是把动态语言和HTTP服务器分离开来。
- 主要是将CGI进程保持在内存中进行管理调度,以获得较高的性能。
- fastCGI的工作原理
- Web服务器启动时载入fastCGI进程管理器
- fastCGI进程管理器自身初始化,启动多个CGI子进程并等待来自Web服务器的连接
- 当客户端请求到达Web服务器时,fastCGI进程管理器选择并连接到一个CGI进程来处理请求
- fastCGI子进程完成处理后将结果返回给Web服务器
- 问题
- Nginx下fastCGI与服务器是分离的,就是Nginx无法直接调用fastCGI,需要用spawn-fcgi来管理
spawn-fcgi
- spawn-fcgi是Nginx和fastCGI之间的桥梁,负责Nginx和fastCGI之间的数据通信

安装
- fastCGI
- ./configure
- make
- make install
- 如果make时报错,在libfcgi/fcgio.cpp中添加头文件 #include <stdio.h>
- spawn-fcgi
- ./configure
- make
- make install
- 关于Nginx的安装另一篇文章中有介绍 : Nginx部署静态网页
环境配置
- Nginx配置
- 主要是将Nginx处理不了的指令交给fastCGI操作
- 打开Nginx配置文件 /usr/local/nginx/conf/nginx.conf,在server字段里加一个location字段
-
# 处理指令location /fastCgiTest{# 配置fastcgi模块,这里的端口是fastCGI进程的端口fastcgi_pass 192.168.206.128:10010# 包含配置文件include fastcgi.conf}
-
- Nginx默认展示登录网页(用该程序替换Nginx默认index.html)
-
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>FastCGI测试网站</title></head><body><h1 align="center">FastCGI测试网站</h1><div class="container"><form method="post" action="http://192.168.206.128/fastCgiTest"><p align="center"><label>姓名:<input type="text" name="username" placeholder="admin" autofocus="autofocus"></label></p><p align="center"><label>密码:<input type="tel" name="phone" placeholder="000" required="required"></label></p><p align="center"><button class="mybtn">登录</button></p></form></div></body></html>
-
spawn-fcgi的使用
- 命令 : spawn-fcgi -a IP -p PORT -f fastcgi程序
- IP : Nginx服务器ip地址,就是上面配置的127.0.0.1
- PORT : 服务器将数据发送到的端口,就是上面我们配置的10010端口
- fastcgi程序 : spawn-fcgi fork fastcgi进程,fastcgi程序需要我们自己实现并编译。
编写fastcgi程序
- 这是参考fastcgi中的一个demo写的一个,主要实现登录功能,如果输入正确的用户名和密码,展示登录成功界面,如果输入错误的用户名和密码,继续展示登录界面,并提示重新登录。
-
#include "fcgi_config.h"#include <stdlib.h>#ifdef HAVE_UNISTD_H#include <unistd.h>#endif#ifdef _WIN32#include <process.h>#elseextern char **environ;#endif#include <string.h>#include "fcgi_stdio.h"//检查登录账号和密码int checkLogin(char* recvBuf, const char* userName, const char* password);int main (){char **initialEnv = environ;int count = 0;while (FCGI_Accept() >= 0) {//请求数据长度char *contentLength = getenv("CONTENT_LENGTH");//请求方法(GET/POST)char *requestmechod = getenv("REQUEST_METHOD");//响应头(printf相当于发送数据)printf("MyFlag: IsFastCGI\r\n"); //可以加自定义响应头printf("Content-type: text/html\r\n");printf("\r\n");int length = 0;//POST请求if(strcmp(requestmechod, "POST") == 0){length = strtol(contentLength, NULL, 10);//post请求没有数据,不处理if(length == 0){continue;}//读取post请求数据char ch;char recvBuf[1024 * 10] = {0};for (int i = 0; i < length; i++) {if ((ch = getchar()) < 0) {printf("read post data failed\n");continue;}recvBuf[i] = ch;}if(checkLogin(recvBuf, "admin", "000")){printf("<h1>Login success!</h1>\r\n");}else{printf("<!DOCTYPE html>\r\n");printf("<html lang=\"en\">\r\n");printf("<head>\r\n");printf("<meta charset=\"UTF-8\">\r\n");printf("<title>FastCGI测试网站</title>\r\n");printf("</head>\r\n");printf("<body>\r\n");printf("<h1 align=\"center\">FastCGI测试网站</h1>\r\n");printf("<div class=\"container\">\r\n");printf("<form method=\"post\" action=\"http://192.168.206.128/fastCgiTest\">\r\n");printf("<p align=\"center\"><label>姓名:<input type=\"text\" name=\"username\" placeholder=\"admin\" autofocus=\"autofocus\"></label></p>\r\n");printf("<p align=\"center\"><label>密码:<input type=\"password\" name=\"password\" placeholder=\"000\" required=\"required\"></label></p>\r\n");printf("<p align=\"center\">\r\n");printf("<button class=\"mybtn\">登录</button>\r\n");printf("</p>\r\n");printf("</form>\r\n");printf("</div>\r\n");printf("<dialog open>\r\n");printf("<p>用户名或密码错误,请重新登录</p>\r\n");printf("<form method=\"dialog\">\r\n");printf("<button align=\"center\">确定</button>\r\n");printf("</form>\r\n");printf("</dialog>\r\n");printf("</html>\r\n");}}} /* while */return 0;}int checkLogin(char* recvBuf, const char* userName, const char* password){ char* p = recvBuf;char* pUserName = strtok(p, "&");char* pPassWord = strtok(NULL, "&");char* pUserNameKey = strtok(pUserName, "=");char* pUserNameValue = strtok(NULL, "=");char* pPassWordKey = strtok(pPassWord, "=");char* pPassWordValue = strtok(NULL, "=");if(strcmp(pUserNameValue, userName) == 0 && strcmp(pPassWordValue, password) == 0){return 1;}return 0;} - 编译
- gcc echo.c -lfcgi
- 启动fastcgi
- spawn-fcgi -a 192.168.206.128 -p 10010 -f ./a.out
- 如果有以下报错,说明启动失败了。先直接启动下a.out看是什么报错
- spawn-fcgi: child exited with: 127
- 直接启动a.out,可以看到以下报错
- ./a.out: error while loading shared libraries: libfcgi.so.0: cannot open shared object file: No such file or directory
- 说明找不到库文件libfcgi.so,这个文件在这个目录下 /usr/local/lib
- 可以把这个目录加到 /etc/ld.so.conf文件中,执行sudo ldconfig
- 再重新启动fastcgi程序。注意a.out前面一定要加路径。
- 有以下打印说明启动成功了
- spawn-fcgi: child spawned successfully: PID: 26378
测试
- 首先我们在浏览器中访问Nginx,默认端口为80。然后会展示我们写的登录网页,在登录网页中输入用户名和密码后,点击提交,会发送POST请求到Nginx配置文件中配置的/fastCgiTest指令上。Nginx就会根据ip和端口将指令转发到fastCGI程序,fastCGI程序处理POST请求数据,如果用户名和密码正确,显示登录成功,如果用户名和密码错误,继续展示登录界面,并提示用户重新登录。
- 先访问Nginx,展示默认网页

- 输入正确的用户名和密码,fastCGI程序处理后展示登录成功界面

- 输入错误的用户名和密码,fastCGI程序处理后,重新展示登录界面,并提示重新登录

相关文章:
Nginx + fastCGI 实现动态网页部署
简介 本文章主要介绍下,如何通过Nginx fastCGI来部署动态网页。 CGI介绍 在介绍fastCGI之前先介绍下CGI是什么。CGI : Common Gateway Interface,公共网关接口。在物理层面上是一段程序,运行在服务器上,提供同客户端HTML页面的…...
精彩回顾 | Fortinet Accelerate 2023·中国区巡展厦门站
Fortinet Accelerate 2023中国区 5月16日,Fortinet Accelerate 2023中国区巡展来到魅力“鹭岛”——厦门,技术、产品和业务专家,携手亚马逊云科技、唯一网络等云、网、安合作伙伴,与交通、物流、金融等各行业典型代表客户&#x…...
ChatGPT 和对话式 AI 的未来:2023 年的进展和应用
人工智能(Artificial Intelligence)在过去一段时间以来以前所未有的速度快速发展。从自动化日常任务到重要提醒的设定,AI以各种方式渗透到我们的生活中。然而,在这个领域中迈出的最重要一步是ChatGPT。 ChatGPT被瑞银(UBS)评为“有史以来增长最快的消费者应用程序”,于…...
Nginx配置WebSocket(WS)和WebSocket Secure(WSS)的完整指南
😀点点关注~ 😀点点关注~ 😀点点关注~ Nginx是一款广泛使用的高性能Web服务器和反向代理服务器。除了传统的HTTP和HTTPS协议支持外,Nginx还可以配置WebSocket(WS)和WebSocket Secure(WSS&…...
链表--part 1--链表基础理论(概括)
文章目录 单链表双链表循环链表链表链表的定义删除节点增加节点 首先什么是链表,链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最…...
【V2G】电动汽车接入电网优化调度研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
Excel中时间戳与标准日期格式的互相转换
背景 在excel中将13位毫秒级别的时间戳转换为标准的日期格式(yyyy-mm-dd hh:mm:ss.000),使用如下模板 TEXT(<source_cell>/1000/8640070*36519,"yyyy-mm-dd hh:mm:ss.000") 在excel中将10位秒级别的时间戳转换为标准的日期格式(yyyy-mm-dd hh:mm:ss…...
【Kafka集群】Kafka针对用户做ACL权限控制
在 Kafka 3.3.1 中,可以使用 ACL(Access Control List)控制用户对 topic 的访问权限。以下是一些基本示例: 创建一个名为 my-topic 的 topic 在命令行中执行以下命令创建一个名为 my-topic 的 topic: kafka-topics.…...
国内外数据安全治理框架介绍与分析
本文将介绍和分析:微软 DGPC框架,Gartner 数据安全治理框架 DSG,数据安全能力成熟度模型 DSMM 数据治理与数据安全治理系列文章 https://luozhonghua.blog.csdn.net/article/details/130417106 数据安全治理流程设计_luozhonghua2000的博客-CSDN博客 数据治理解决之道探讨…...
【Nodejs】使用Nodejs搭建HTTP服务,并实现公网远程访问
文章目录 前言1.安装Node.js环境2.创建node.js服务3. 访问node.js 服务4.内网穿透4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5.固定公网地址 转载自内网穿透工具的文章:使用Nodejs搭建HTTP服务,并实现公网远程访问「内网穿透」 前言 Node.js…...
面试题之介绍自己测试的项目,担任的角色和做出的成果
在测试面试过程中,面试官想要了解一个同学对项目的掌握程度或一些例如沟通总结的软技能情况,该怎么考察呢? 一个具有代表性的题目来了:简单介绍一下自己测试的项目,担任的角色和做出的成果。 一、面试官角度 1、考察是否真正做过该…...
HTB靶机012-Valentine-WP
012-Valentine 靶机IP:10.10.10.79 Scan nmap端口扫描: ┌──(xavier㉿kali)-[~] └─$ sudo nmap -sSV -T4 10.10.10.79 -F Starting Nmap 7.93 ( https://nmap.org ) at 2023-04-29 00:47 CST Nmap scan report for 10.10.10.79 Host is up (0.30s…...
微信小程序nodejs+vue社区居民健康服务系统uniapp
系统分为社区居民,管理员,县区工作员,社区工作员三个角色 县区工作员的主要功能: 1.对社区的工作人员进行添加,修改,删除,查询 2.疫情专栏的信息进行添加,修改,删除&…...
尝试探索水下目标检测,基于yolov5轻量级系列模型n/s/m开发构建海底生物检测系统
其实,水下目标检测相关的项目早在之前就已经做了几个了,但是没有系统性地对比过,感兴趣的话可以先看下之前的文章,如下: 《基于自建数据集【海底生物检测】使用YOLOv5-v6.1/2版本构建目标检测模型超详细教程》 《基于…...
大数据Doris(二十四):Doris数据Insert Into导入方式介绍
文章目录 Doris数据Insert Into导入方式介绍 一、语法及参数 二、案例 三、注意事项 1、关于插入数据量 2、关于insert操作返回结果 3、关于导入任务超时 4、关于Session变量 5、关于数据导入错误 Doris数据Insert Into导入方式介绍 Doris 提供多种数据导入方案&…...
macOS Ventura 13.5beta (22G5027e)发布
系统介绍 黑果魏叔 5 月 20 日消息,苹果今日向 Mac 电脑用户推送了 macOS 13.5 开发者预览版 Beta 更新(内部版本号:22G5027e),本次更新距离上次发布隔了 17 天。 macOS Ventura 带来了台前调度、连续互通相机、Face…...
基于SpringBoot的财务管理系统的设计与实现
背景 财务管理系统能够通过互联网得到广泛的、全面的宣传,让尽可能多的员工了解和熟知财务管理系统的便捷高效,为管理者和员工提供了服务,节省人力、物力和时间,提高工作效率。 系统设计 为了更好的去理清本系统整体思路&#…...
使用OpenCV进行肺炎诊断检测
肺炎是一种由感染引起的严重呼吸道疾病,特别是在高危人群中,可能会出现危及生命的并发症。必须尽快诊断和治疗肺炎,以最大限度地提高患者康复的机会。 诊断过程并不容易,需要一些医学实验室工具和先进的医疗技能,但我们…...
北华大学第九届程序设计竞赛 题解
5.14和队友VP一场,第二次VP,状态明显比第一次好很多,总共A了7题,基本是能做出来的都做出来了,最后还剩下接近2小时的时间。。。。。 A "北华"有几何 思路:数图片中“北华”的数量,直…...
【Java算法题】剑指offer_01数据结构
前言 刷题链接: https://www.nowcoder.com/exam/oj/ta?page2&tpId13&type265 1. 链表 JZ24 反转链表 思路:基本操作,如下所示。 /* public class ListNode {int val;ListNode next null;ListNode(int val) {this.val val;} }…...
MCP Server生产级配置:Playwright与LLM集成的避坑指南
1. 这不是又一个“Playwright入门教程”,而是一份能直接塞进CI流水线的MCP Server生产级配置实录你有没有遇到过这样的场景:团队刚决定用AI驱动自动化测试,技术选型会上大家一致看好Playwright MCP(Model Context Protocol&#…...
别再手动改路径了!用LabVIEW + MATLAB Script做自动化测试,这份环境配置指南让你效率翻倍
LabVIEW与MATLAB深度整合:构建自动化测试系统的工程实践指南在工业自动化与测试测量领域,LabVIEW和MATLAB的组合堪称黄金搭档。LabVIEW擅长硬件接口和实时控制,而MATLAB在算法开发和数据分析方面具有无可比拟的优势。本文将深入探讨如何将两者…...
30岁裸辞后,我用两个月拿下AI应用认证,现在OFFER选择困难症犯了
30岁裸辞那天,我最怕的不是没收入,而是突然发现:过去积累的经验,正在被AI重新定价。以前会写方案、做表格、跟项目,算是职场硬通货;到了2026年,招聘JD里开始频繁出现AI工具应用、智能工作流、Pr…...
2026年,揭秘那些真正安全的原生态食材厂家你不可不知的秘密
随着人们生活水平的提升以及对健康的日益重视,选择真正安全的原生态食材已经成为许多人购买食物的标准。但市场的繁杂使得甄别真正安全的食材厂家变得愈加困难。今天,我将通过几个关键角度,为大家揭秘那些真正安全的原生态食材厂家的秘密&…...
QMCDecode终极指南:3步解锁QQ音乐加密格式,实现跨平台音乐自由
QMCDecode终极指南:3步解锁QQ音乐加密格式,实现跨平台音乐自由 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac,qmc0,qmc3转mp3, mflac,mflac0等转flac),仅支持macOS,可自动识别到QQ音乐下载目…...
基于随机森林的低成本传感器机器学习校准实践指南
1. 项目概述:当低成本传感器遇上机器学习校准在物联网和智能感知系统铺天盖地的今天,低成本传感器几乎无处不在。从监测办公室的空气质量,到追踪城市街道的噪音污染,再到农业大棚里的温湿度控制,这些价格亲民的“小眼睛…...
保姆级教程:在Ubuntu上配置Frida环境,搞定Android App的IO重定向与签名绕过
在Ubuntu上构建Android逆向工程环境:Frida实战与IO重定向技术解析 对于习惯Linux环境的安全研究人员而言,Windows-centric的逆向工具链往往带来诸多不便。本文将系统性地介绍如何在Ubuntu上搭建完整的Android逆向环境,并深入探讨如何利用Frid…...
学了几天 Web 安全,终于搞懂什么是 XSS 了
xss的详细介绍最近开始正式学习 Web 安全。前面陆续学了:HTTPCookieSessionJWT RBAC然后发现很多地方都会提到一个东西:XSS以前一直感觉这个漏洞很抽象。网上很多文章一上来就是:<script>alert(1)</script>然后说:“弹…...
如何快速上手Redux Dynamic Modules:5分钟完成Redux模块化改造
如何快速上手Redux Dynamic Modules:5分钟完成Redux模块化改造 【免费下载链接】redux-dynamic-modules Modularize Redux by dynamically loading reducers and middlewares. 项目地址: https://gitcode.com/gh_mirrors/re/redux-dynamic-modules Redux Dyn…...
DeepSeek-R1代码补全实测报告:37个真实项目、8类编程语言、48小时压测后,我删掉了Copilot
更多请点击: https://intelliparadigm.com 第一章:DeepSeek-R1代码补全实测报告总览 DeepSeek-R1 是深度求索(DeepSeek)推出的开源大语言模型,专为代码理解与生成任务优化。本章聚焦其在主流 IDE 环境中代码补全能力的…...

