本文介绍: 在介绍fastCGI之前先介绍下CGI是什么。CGI : Common Gateway Interface,公共网关接口。在物理层面上是一段程序,运行在服务器上,提供同客户端HTML页面的接口。Nginx+CGI处理步骤用户发送HTTP请求到Web服务器Web服务器fork一个CGI子进程,将用户请求交给CGI程序CGI程序把处理结果传送给Web服务器,CGI子进程被销毁Web服务器把结果返回到用户CGI缺点。
简介
CGI介绍
- 在介绍fastCGI之前先介绍下CGI是什么。
- CGI : Common Gateway Interface,公共网关接口。在物理层面上是一段程序,运行在服务器上,提供同客户端HTML页面的接口。
- Nginx+CGI处理步骤
- CGI缺点
- fastCGI
fastCGI
- FastCGI是一个可伸缩的、高速的在HTTP服务器和动态脚本语言间通信的接口,主要优点是把动态语言和HTTP服务器分离开来。
- 主要是将CGI进程保持在内存中进行管理调度,以获得较高的性能。
- fastCGI的工作原理
- 问题
spawn-fcgi
安装
- fastCGI
- 如果make时报错,在libfcgi/fcgio.cpp中添加头文件 #include <stdio.h>
- spawn-fcgi
- 关于Nginx的安装另一篇文章中有介绍 : Nginx部署静态网页
环境配置
- Nginx配置
- 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="password" name="password" placeholder="000" required="required"></label></p> <p align="center"> <button class="mybtn">登录</button> </p> </form> </div> </body> </html>
-
spawn-fcgi的使用
编写fastcgi程序
- 这是参考fastcgi中的一个demo写的一个,主要实现登录功能,如果输入正确的用户名和密码,展示登录成功界面,如果输入错误的用户名和密码,继续展示登录界面,并提示重新登录。
-
#include "fcgi_config.h" #include <stdlib.h> #ifdef HAVE_UNISTD_H #include <unistd.h> #endif #ifdef _WIN32 #include <process.h> #else extern 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: IsFastCGIrn"); //可以加自定义响应头 printf("Content-type: text/htmlrn"); printf("rn"); 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 failedn"); continue; } recvBuf[i] = ch; } if(checkLogin(recvBuf, "admin", "000")){ printf("<h1>Login success!</h1>rn"); }else{ printf("<!DOCTYPE html>rn"); printf("<html lang="en">rn"); printf("<head>rn"); printf("<meta charset="UTF-8">rn"); printf("<title>FastCGI测试网站</title>rn"); printf("</head>rn"); printf("<body>rn"); printf("<h1 align="center">FastCGI测试网站</h1>rn"); printf("<div class="container">rn"); printf("<form method="post" action="http://192.168.206.128/fastCgiTest">rn"); printf("<p align="center"><label>姓名:<input type="text" name="username" placeholder="admin" autofocus="autofocus"></label></p>rn"); printf("<p align="center"><label>密码:<input type="password" name="password" placeholder="000" required="required"></label></p>rn"); printf("<p align="center">rn"); printf("<button class="mybtn">登录</button>rn"); printf("</p>rn"); printf("</form>rn"); printf("</div>rn"); printf("<dialog open>rn"); printf("<p>用户名或密码错误,请重新登录</p>rn"); printf("<form method="dialog">rn"); printf("<button align="center">确定</button>rn"); printf("</form>rn"); printf("</dialog>rn"); printf("</html>rn"); } } } /* 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; }
- 编译
- 启动fastcgi
- 说明找不到库文件libfcgi.so,这个文件在这个目录下 /usr/local/lib
- 可以把这个目录加到 /etc/ld.so.conf文件中,执行sudo ldconfig
- 再重新启动fastcgi程序。注意a.out前面一定要加路径。
- 有以下打印说明启动成功了
环境变量
测试
- 首先我们在浏览器中访问Nginx,默认端口为80。然后会展示我们写的登录网页,在登录网页中输入用户名和密码后,点击提交,会发送POST请求到Nginx配置文件中配置的/fastCgiTest指令上。Nginx就会根据ip和端口将指令转发到fastCGI程序,fastCGI程序处理POST请求数据,如果用户名和密码正确,显示登录成功,如果用户名和密码错误,继续展示登录界面,并提示用户重新登录。
- 先访问Nginx,展示默认网页
- 输入正确的用户名和密码,fastCGI程序处理后展示登录成功界面
- 输入错误的用户名和密码,fastCGI程序处理后,重新展示登录界面,并提示重新登录
原文地址:https://blog.csdn.net/new9232/article/details/130777776
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_27476.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。