Nginx + fastCGI 实现动态网页部署

news2024/11/17 1:30:37

简介

  • 本文章主要介绍下,如何通过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 127.0.0.1:10010
          	# 包含配置文件
          	include fastcgi.conf
          }
        

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
  •  #ifndef lint
     static const char rcsid[] = "$Id: echo.c,v 1.5 1999/07/28 00:29:37 roberts Exp $";
     #endif /* not lint */
    
     #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 "fcgi_stdio.h"
    
     static void PrintEnv(char *label, char **envp)
     {
     	printf("%s:<br>\n<pre>\n", label);
     	for ( ; *envp != NULL; envp++) {
         	printf("%s\n", *envp);
     	}
     	printf("</pre><p>\n");
     }
    
     int main ()
     {
     	char **initialEnv = environ;
     	int count = 0;
    
     	//循环接收请求
     	while (FCGI_Accept() >= 0) {
     		//接收的数据长度,只有post请求这个值才大于0
         	char *contentLength = getenv("CONTENT_LENGTH");
         	int len = 0;
    
     		//相当于发送数据
     		printf("Content-type: text/html\r\n"
     		"\r\n"
         	"<title>FastCGI echo</title>"
         	"<h1>FastCGI echo</h1>\n"
             "Request number %d,  Process ID: %d<p>\n", ++count, getpid());
    
     		//将字符串转为int
         	if (contentLength != NULL) {
             	len = strtol(contentLength, NULL, 10);
         	} else {
             	len = 0;
         	}
    
         	if (len <= 0) {
         		printf("No data from standard input.<p>\n");
         	}
         	else { // 有post请求数据
             	int i, ch;
    
         		printf("Standard input:<br>\n<pre>\n");
             	for (i = 0; i < len; i++) {
     			// 读取post请求数据
                 	if ((ch = getchar()) < 0) {
                     	printf("Error: Not enough bytes received on standard input<p>\n");
                     	break;
     				}
     			//发送数据
                 	putchar(ch);
             	}
             	printf("\n</pre><p>\n");
         	}
    
     		//打印信息
         	PrintEnv("Request environment", environ);
        	 	PrintEnv("Initial environment", initialEnv);
     	} /* while */
    
     	return 0;
     }
    
  • 编译
    • gcc echo.c -lfcgi
  • 启动fastcgi
    • spawn-fcgi -a 127.0.0.1 -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

测试

  • 直接在浏览器中访问 http://192.168.206.128/fastCgiTest,就可以看到效果了
    在这里插入图片描述
  • 接下来我们就可以在fastcgi程序中自己去实现处理网页请求的逻辑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/548829.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

测试理论----Bug的严重程度(Severity)和优先级(Priority)的分类

【原文链接】测试理论----Bug的严重程度&#xff08;Severity&#xff09;和优先级&#xff08;Priority&#xff09;的分类 一、Bug的严重程度&#xff08;Severity&#xff09; Bug的Severity&#xff08;严重程度&#xff09;指的是一个Bug对软件系统功能影响的程度&#…

Java常用工具之Collections

目录 一、排序操作二、查找操作三、同步控制三、不可变集合四、其他五、CollectionUtils&#xff1a;Spring 和 Apache 都有提供的集合工具类六 、小结 Collections 是 JDK 提供的一个工具类&#xff0c;位于 java.util 包下&#xff0c;提供了一系列的静态方法&#xff0c;方便…

2023河海大学846软件工程学硕考研高分上岸经验分享

大家好&#xff0c;我是陪你考研每一天的大巴学长。 大巴学长为大家邀请到了2023年846软件工程学硕刚刚上岸的学长&#xff0c;为大家分享一下他的考研经验&#xff0c;经验里详细介绍了各科的复习方法&#xff0c;很有参考意义。 希望对大家有所借鉴和帮助&#xff0c;在此向…

栈实现队列(继续细起来啊)

生命不是要等待风暴过去&#xff0c;而是要学会在风暴中跳舞。 ——卡莉尔吉布朗目录 &#x1f341;一.栈实现队列 &#x1f340;二.使用两个栈实现队列的功能 &#x1f33c;1.在队列的结构体中创建两个栈 &#x1f681;2.创建一个队列的结构体指针 &#x1f309;3…

云计算中的大数据处理:尝试HDFS和MapReduce的应用

云计算中的大数据处理&#xff1a;尝试HDFS和MapReduce的应用 文章目录 云计算中的大数据处理&#xff1a;尝试HDFS和MapReduce的应用一、前言二、第一题1、命令方式2、java API方式 三、第二题1、创建CSV文件并将其上传到HDFS2、编写利用MapReduce框架的java代码3、打包java项…

【设计模式与范式:创建型】41 | 单例模式(上):为什么说支持懒加载的双重检测不比饿汉式更优?

从今天开始&#xff0c;我们正式进入到设计模式的学习。我们知道&#xff0c;经典的设计模式有 23 种。其中&#xff0c;常用的并不是很多。据我的工作经验来看&#xff0c;常用的可能都不到一半。如果随便抓一个程序员&#xff0c;让他说一说最熟悉的 3 种设计模式&#xff0c…

Kelvin和Rossby波 Part-2(浅水方程)

在前面博主有篇关于Kelvin和Rossby波的简要介绍&#xff0c;见下&#xff1a; Kelvin和Rossby波 Part-1&#xff08;简要介绍&#xff09; 开尔文波&#xff08;Kelvin Wave&#xff09;是发生在大气或海洋中的&#xff0c;迎向地形边界&#xff08;例如海岸线&#xff09;平衡…

回顾2023年计算机专业学生卑微求职 / 申博血泪史

0.前言 2023年是悲惨的一年&#xff0c;各个行业都在卷中卷。同时对于个人来说&#xff0c;2023年也是最忙碌的一年&#xff0c;不仅面临毕业&#xff0c;而且面临工作/读博&#xff0c;随便挑出一件&#xff0c;都是一件耗时耗力的事。相信大家也从网络上看到了很多的帖子或者…

文心一言 VS 讯飞星火 VS chatgpt (19)-- go语言的slice和rust语言的Vec的扩容流程是什么?

go语言的slice和rust语言的Vec的扩容流程是什么&#xff1f; 文心一言&#xff1a; 在Go语言中&#xff0c;slice&#xff08;切片&#xff09;和Rust语言中的Vec都是用于存储一组固定长度的元素的数据结构。它们的扩容流程略有不同&#xff0c;下面是它们的基本概述&#xf…

HNU数据结构与算法分析-作业3-树结构

1. (简答题) 5.1 定义满二叉树的每一个结点或者是一个分支结点&#xff0c;并恰好有两个非空子结点&#xff1b;或者是叶结点。 证明在有n个分支结点的所有二叉树中&#xff0c;满二叉树的叶结点的数目&#xff08;或者叶结点与全部结点数的比例&#xff09;是最高的。 5.6 …

Linux下安装配置maven

1.安装以及配置maven 1.1.下载maven安装包 首先需要切换到自己需要安装的目录 把配置都放到了&#xff1a;/root路径下 1.2.解压下载好的maven包 tar -zxvf apache-maven-3.6.0-bin.tar.gzcp -r apache-maven-3.6.0 /usr/local/1.3.配置maven环境变量 1.3.1.在环境变量中…

微信小程序nodejs+vue校园二手商城交易(积分兑换)38gw6

随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;校园二手交易被用户普遍使用&#xff0c;为方便用户能够可以随时…

chatgpt赋能Python-python3_8怎么设置字体大小

Python3.8如何设置文本字体大小 Python是一种高级编程语言&#xff0c;它在全球开发者中间得到了广泛的应用。随着Python的不断发展&#xff0c;Python 3.8版本也应运而生。在这个新版本中&#xff0c;有许多新的功能&#xff0c;其中一个是设置文本字体大小。本文将展示如何在…

redis高级篇三(分片集群)

一)进行测试Sentinel池: 集群的定义:所谓的集群&#xff0c;就是通过增加服务器的数量&#xff0c;提供相同的服务&#xff0c;从而让服务器达到一个稳定、高效的状态 之前的哨兵模式是存在着一些问题的&#xff0c;因为如果主节点挂了&#xff0c;那么sentinel集群会选举新的s…

一些题目__

好耶&#xff0c;第一次div2做出来3道题&#xff0c;虽然中间看了个题解&#xff0c;但是思路差不多&#xff0c;被复杂度困住了&#xff0c;nnd 首先是第一个题&#xff0c;emm 第一题 那么这个题的要求是&#xff0c;构造一个数组&#xff0c;满足这些条件&#xff1a; 注意…

Java学习路线(6)——方法

概念&#xff1a; 方法是一种语法结构&#xff0c;可以将一段代码封装成一个功能&#xff0c;方便复用。 特点&#xff1a; 提高代码复用性提高逻辑清晰性 一、基本方法定义和调用 1、有反有参方法 修饰符 返回类型 方法名( 形参列表 ){ 方法体代码; return 返回值; } public…

printf串口重定向标准方法

一&#xff0c;简介 在程序调试的过程中&#xff0c;需要用到串口打印信息来判断单片机程序运行是否正确。需要使用串口对printf进行重定向&#xff0c;本文就介绍一下ARM官方推荐的一种重定向的方法&#xff0c;供参考使用。 二&#xff0c;具体步骤 主要分为两步&#xff…

leetcode 138.复制带随机指针的链表

题目链接&#xff1a;leetcode 138 1.题目 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中每个新节…

如何用Nginx实现对城市以及指定IP的访问限制?

1.前言 在【如何用Nginx代理MySQL连接&#xff0c;并限制可访问IP】一文中&#xff0c;我们实现了通过Nginx代理MySQL连接&#xff0c;并限制了指定IP才能通过Nginx进行连接&#xff0c;以提高数据安全性。 该场景适用于根据具体的IP地址来进行访问限制&#xff0c;假如我们要…