Nginx 本身不能执行外部程序,Nginx 处理 PHP 是通过 PHP 的 fastcgi 管理器(php-fpm)进行处理,然后 nginx 再将结果返回给用户;所以如果我们需要通过 cgi 程序(shell、perl、c/c++ 等)来编写网站后台的话,就需要使用 fcgiwrap 这个通用的 fastcgi 进程管理器来帮助 nginx 处理 cgi。

  • 对于 PHP:只建议使用 PHP-FPM,因为这是官方的解决方案,性能和稳定性肯定是最好的。

  • 对于其它 CGI 程序:如 Shell、Perl、C/C++、Python,推荐使用 fcgiwrap,这是一个通用的 FCGI 管理器。

写这篇博客的主要目的也是为了让 Nginx 执行 Shell、Perl、C/C++、Python 程序,因为作为一个生信出身的伪 IT 工作者,Shell、Perl、Python 永远都是我们最熟悉的,用这些语言来编写网站后台可以更加节省我们的时间,效率更高。

概念

1. CGI 与 FastCGI

CGI 全称是 "公共网关接口" (Common Gateway Interface),HTTP 服务器与你的或其它机器上的程序进行 "交谈" 的一种工具,其程序须运行在网络服务器上。它和 FastCGI(快速通用网关接口)都是语言无关的协议。CGI 诞生已经非常久远了,由于它每次在处理一个请求(连接)时都要重新启动脚本(可执行文件),重新传递所有的环境变量(其中非常多是完全一样的),导致性能非常低下。虽然性能较低,但功不可没,后来出现了性能更高的 FastCGI。

FastCGI(简称 FCGI)是 CGI 的增强版本,FCGI 可以简单的理解为 CGI + 多进程模型。FCGI 的工作模式有点类似于 Nginx,一个 Master 进程和多个 Worker 进程。Master 进程主要用来监控 Worker 进程的运行情况,当某个 Worker 进程意外退出时,Master 进程会随即启动一个新的 Worker 进程;Worker 进程则是真正干活的进程,用来执行 CGI 程序(传递环境变量、标准输入),获取 CGI 程序的标准输出,再将其返回为 Web 服务器(如 Apache、Nginx)。Worker 进程处理完请求后不会结束运行,而是继续等待下一个请求的到来,直到我们手动关闭它们。

2. Spawn-FCGI 与 FcgiWrap

Spawn-FCGI 是一个通用的 FastCGI 管理服务器,它是 lighttpd 中的一部份,很多人都用 Lighttpd 的 Spawn-FCGI 进行 FastCGI 模式下的管理工作。之前一直以为 Nginx 执行 CGI 程序需要 spawn-fcgi 和 fcgiwrap 两个东西(网上很多文档都是抄来抄去,搞得我也一头雾水,只好照做),但是实际上只需要 fcgiwrap,spawn-fcgi 的作用仅仅是启动和配置 fcgiwrap,这个工作完全可以由 fcgiwrap 自己来完成,所以 spawn-fcgi 不安装也不会影响 fcgiwrap 的使用。

Spawn-FCGI 目前已经独成为一个项目,更加稳定一些,也给很多 Web 站点的配置带来便利。已经有不少站点将它与 nginx 搭配来解决动态网页。目前 Spawn-FCGI 的下载地址是:

http://redmine.lighttpd.net/projects/spawn-fcgi。

FcgiWrap:Simple FastCGI wrapper for CGI scripts。首先这个东西的作用。它为那些不支持直接运行 CGI 脚本的 Web 服务器提供一种运行 CGI 脚本的方式。NGINX 就是一个只支持 FastCGI,不支持 CGI 的 HTTP(Web)服务器之一。也是我用得最多最熟悉的 Web 服务器。虽然 Apache 支持直接跑 CGI,但很少使用它的我对它并不感冒,这里也就不再讨论了。

安装与配置

2.1 安装 fcgiwrap

安装依赖:

yum -y install autoconf automake libtool fcgi fcgi-devel spawn-fcgi

安装 fcgiwrap:

$ git clone https://github.com/gnosek/fcgiwrap
$ cd fcgiwrap
$ autoreconf -i
$ ./configure     # fcgiwrap 默认安装到 /usr/local/sbin/fcgiwrap
$ make
$ make install

2.2 配置 spawn-fcgi

通过 yum install spawn-fcgi 方式安装的 spawn-fcgi 配置文件默认为:/etc/sysconfig/spawn-fcgi,编辑该文件:

vi /etc/sysconfig/spawn-fcgi

# You must set some working options before the "spawn-fcgi" service will work.
# If SOCKET points to a file, then this file is cleaned up by the init script.
#
# See spawn-fcgi(1) for all possible options.
#
# Example :
#SOCKET=/var/run/php-fcgi.sock
#OPTIONS="-u apache -g apache -s $SOCKET -S -M 0600 -C 32 -F 1 -P /var/run/spawn-fcgi.pid -- /usr/bin/php-cgi"
FCGI_SOCKET=/var/run/fcgiwrap.sock
FCGI_PROGRAM=/usr/local/sbin/fcgiwrap
FCGI_USER=nginx
FCGI_GROUP=nginx
FCGI_EXTRA_OPTIONS="-M 0777"
OPTIONS="-u $FCGI_USER -g $FCGI_GROUP -s $FCGI_SOCKET -S $FCGI_EXTRA_OPTIONS -F 1 -P /var/run/spawn-fcgi.pid -- $FCGI_PROGRAM"

2.3 启动 spawn-fcgi 服务

[root@ecs-steven conf]# systemctl enable spawn-fcgi     # 添加开机启动(或者:chkconfig spawn-fcgi on)
spawn-fcgi.service is not a native service, redirecting to /sbin/chkconfig.
Executing /sbin/chkconfig spawn-fcgi on

$ systemctl start spawn-fcgi    # 启动 spawn-fcgi 服务(或者:service spawn-fcgi start)

spawn-fcgi 启动出现下面报错:

[root@ecs-steven ~]# service spawn-fcgi start
Starting spawn-fcgi (via systemctl):  Job for spawn-fcgi.service failed because the control process exited with error code. See "systemctl status spawn-fcgi.service" and "journalctl -xe" for details.
                                                           [FAILED]

[root@ecs-steven ~]# systemctl status spawn-fcgi.service
● spawn-fcgi.service - LSB: Start and stop FastCGI processes
   Loaded: loaded (/etc/rc.d/init.d/spawn-fcgi; bad; vendor preset: disabled)
   Active: failed (Result: exit-code) since Fri 2019-04-26 08:31:51 CST; 9min ago
     Docs: man:systemd-sysv-generator(8)
  Process: 7069 ExecStart=/etc/rc.d/init.d/spawn-fcgi start (code=exited, status=1/FAILURE)

Apr 26 08:31:51 ecs-steven systemd[1]: Starting LSB: Start and stop FastCGI processes...
Apr 26 08:31:51 ecs-steven spawn-fcgi[7069]: Starting spawn-fcgi: spawn-fcgi: can't find user name nginx
Apr 26 08:31:51 ecs-steven spawn-fcgi[7069]: [FAILED]
Apr 26 08:31:51 ecs-steven systemd[1]: spawn-fcgi.service: control process exited, code=exited status=1
Apr 26 08:31:51 ecs-steven systemd[1]: Failed to start LSB: Start and stop FastCGI processes.
Apr 26 08:31:51 ecs-steven systemd[1]: Unit spawn-fcgi.service entered failed state.
Apr 26 08:31:51 ecs-steven systemd[1]: spawn-fcgi.service failed.

这种情况我们需要创建 nginx 用户,然后启动 spawn-fcgi.service:

[root@ecs-steven conf]# /usr/sbin/useradd nginx -s /bin/false

[root@ecs-steven conf]# service spawn-fcgi start
Starting spawn-fcgi (via systemctl):                       [  OK  ]

2.4 配置 Nginx

[root@ecs-steven conf]# vim nginx.conf

user  nginx nginx;
worker_processes  1;

error_log      logs/error.log;
pid                  logs/nginx.pid;

events {
worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  logs/access.log  main;

    sendfile                    on;
    #tcp_nopush                 on;
    client_max_body_size  50m;

    keepalive_timeout  65;
    gzip  on;

    server {
        listen       80;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

    include sites-available/*.conf;
}

在 Nginx 目录下添加 sites-available/fcgi.conf 文件:

[root@ecs-steven conf]# cat sites-available/fcgi.conf
server {
    listen 80;

    access_log  logs/fcgi_access.log;
    error_log   logs/fcgi_error.log debug;

    # 开启 SSL 配置
    #listen  443;
    #ssl on;
    #server_name tools.shenweiyan.com;
    #ssl_certificate   ../cert/tools/tools.shenweiyan.com.pem;
    #ssl_certificate_key  ../cert/tools/tools.shenweiyan.com.key;
    #ssl_session_timeout 5m;
    #ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    #ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    #ssl_prefer_server_ciphers on;

    root /apps/tools;

    location / {
        index  index.html index.htm;
    }

   location ~ .*\.(pl|py|cgi)?$ {
        include        /usr/local/software/nginx/conf/fastcgi_params;
        fastcgi_pass   unix:/var/run/fcgiwrap.sock;
        fastcgi_index  index.cgi;
        fastcgi_param  SCRIPT_FILENAME /apps/tools/$fastcgi_script_name;
    }
}

最后,重启 Nginx:

$ service nginx reload 

或者:
$ systemctl restart nginx

添加 CGI 程序

编写 CGI 测试程序:

$ vim /apps/tools/test.cgi

#!/usr/bin/perl -w
print "Content-type: text/html\n\n";    
print "<html><head><title>Hello World!</title></head>\n";
print "<body><h1>Hello world, CGI work!</h1>
</body></html>\n";

设定权限:

$chmod 0755 /apps/tools/test.cgi
$ chown nginx.nginx /apps/tools/test.cgi

最后,利用 firefox/chrome 测试!http://192.168.xxx.xxx/test.cgi 访问出现 "Hello world, CGI work!" 即说明配置部署成功。

——The  End——

本文分享自微信公众号 - 生信科技爱好者(bioitee)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

CentOS Linux 7 配置 nginx 支持 CGI的更多相关文章

  1. CentOS 6.7 配置nginx支持SSL/https访问

    一.安装必要的包 yum install openssl openssl-devel 二.配置编译参数,增加对SSL的支持 ./configure –with-http_ssl_module 三.修改 ...

  2. Linux下安装php环境并且配置Nginx支持php-fpm模块[www]

    Linux下安装php环境并且配置Nginx支持php-fpm模块 http://www.cnblogs.com/freeweb/p/5425554.html 5分钟搭建 nginx +php --- ...

  3. centos下配置nginx支持php

    添加nginx 默认主页index.php vim .../etc/nginx/conf.d/default.conf location / { root   /usr/share/nginx/htm ...

  4. Linux - 配置php-fpm 以及 配置nginx支持php

    配置php-fpm [root@localhost php7]# which php-fpm /usr/local/php7/sbin/php-fpm [root@localhost php7]# p ...

  5. LNMP搭建04 -- 配置Nginx支持PHP

    首先建立存放网页文件的目录,执行 mkdri /usr/local/server/www  然后进入到该目录中 cd /usr/local/server/www 然后创建一个测试文件: phpinfo ...

  6. Ubuntu下安装LNMP之php7的安装并配置Nginx支持php及卸载php

    据了解,php7是比之前的版本性能快很多的.http://php.net/get/php-7.2.2.tar.gz/from/a/mirror 安装前也可提前将相关依赖库安装好,或者在安装php时若安 ...

  7. 在CentOS/Windows下配置Nginx(以及踩坑)

    在CentOS/Windows下配置Nginx(以及踩坑) 1. 序言 因为这类文章网上比较多,实际操作起来也大同小异,所以我并不会着重于详细配置方面,而是将我配置时踩的坑写出来. 2. CentOS ...

  8. CentOS 7 下配置 Nginx + PHP7.1 + MariaDB 以及 Laravel 框架 2018.3.11

    CentOS 7 下配置 Nginx + PHP7.1 + MariaDB 以及 Laravel 框架 阿里云服务器的选择 当然是选择学生优惠啦.这里阿里云还提供了轻量级服务器这个选项,可以预装 LA ...

  9. CentOS 7 下配置 Nginx + PHP7.1 + MariaDB 以及 Laravel 框架

    <!doctype html> CentOS 7 下配置 Nginx + PHP7.1 + MariaDB 以及 Laravel 框架.mdhtml {overflow-x: initia ...

  10. 配置nginx支持Https

    配置nginx支持Https一定要先使用stop停止nginx然后重新代开不能使用reload 一:安装letsencrypt 1.从git上克隆下来git clone https://github. ...

随机推荐

  1. Python 霸榜的一周,又有什么新 AI 力作呢?「GitHub 热点速览」

    GPT 带火了一波语言模型,LLaMA 和 Alpaca 也在持续发力.依旧是各类 GPT 后缀霸榜 GitHub trending 的一周,为此特推部分专门收录了两个比较不错的 GPT 应用.而作为 ...

  2. pandas这dataframe结构

    认识DataFrame结构 DataFrame 一个表格型的数据结构,既有行标签(index),又有列标签(columns),它也被称异构数据表,所谓异构,指的是表格中每列的数据类型可以不同,比如可以 ...

  3. 【D01】Django中实现带进度条的倒计时功能(简易版)

    首先说明简易版是只有一个 倒计时 和一个 进度条,页面加载后自动开始计时,下次计时需要手动刷新页面. 后续会更新实现完整的倒计时功能的文章 前期准备 前端框架 你需要准备一些前端框架:Bootstra ...

  4. 使用Python代码远程连接服务器

    目录 一.paramiko模块的介绍 二.基本使用(用户名密码登录) 三.用公钥私钥连接 一.paramiko模块的介绍 模块介绍 使用Python的第三方模块paramiko实现远程连接服务器 功能 ...

  5. OpenAI-GPT

    操作系统:CentOS 7.6 安装依赖软件 进入 root 账号: sudo -i 安装部署 ChatGPT 必备的软件,并且启动 nginx : yum install git nginx -y ...

  6. 《爆肝整理》保姆级系列教程-玩转Charles抓包神器教程(15)-Charles如何配置反向代理

    1.简介 在App开发的过程当中,抓包是一个很常见的需求,而有些app的请求不会在网络设置代理时被抓到数据包,这里若是需要抓包就需要搭建反向代理. 2.什么是代理? 什么是代理,来一张图了解一下. 代 ...

  7. windows查看占用端口

    1. 查看占用 执行:netstat -ano 或者 netstat -aon|findstr 8080 2. 查看指定 PID 的进程 tasklist|findstr 3104 3. 结束进程 t ...

  8. 图像I、P、B帧介绍

    I.p.b 帧 I帧:帧内编码帧 :尽可能去除图像空间冗余信息来压缩传输数据量的帧内编码图像:P帧:前向预测编码帧: 通过充分将低于图像序列中前面已编码帧的时间冗余信息来压缩传输数据量的编码图像,也叫 ...

  9. ClickHouse主键索引最佳实践

    在本文中,我们将深入研究ClickHouse索引.我们将对此进行详细说明和讨论: ClickHouse的索引与传统的关系数据库有何不同 ClickHouse是怎样构建和使用主键稀疏索引的 ClickH ...

  10. [C++核心编程] 3、函数提高

    文章目录 3 函数提高 3.1 函数默认参数 3.2 函数占位参数 3.3 函数重载 3.3.1 函数重载概述 3.3.2 函数重载注意事项 3 函数提高 3.1 函数默认参数 在C++中,函数的形参 ...