陈拓 2020.10.20/2020.10.21

1. 概述

在《树莓安装Nginx并支持CGI》


一文中我们在树莓派上安装了Nginx并设置了CGI的支持。本文在Ubuntu系统上设置CGI支持。

树莓派的官方系统和Ubuntu都是基于Debian发行版,所以设置是一样的。

查看系统内核版本号:

uname -a

nginx支持stream nginx支持cgi_Ubuntu Lnux

Ubuntu版本号

cat /etc/issue

nginx支持stream nginx支持cgi_nginx支持stream_02

2. 设置

  • 登录Ubuntu服务器

可以用putty,也可以用Windows 10内置的SSH客户端,我们就用它吧。服务器上已经创建了用户ct,服务器的IP地址是92.168.1.8。

ssh ct@192.168.1.8

nginx支持stream nginx支持cgi_Nginx_03

  • 查看Nginx进程

ps -ef | grep nginx

nginx支持stream nginx支持cgi_nginx_04

master是主进程,worker是工作进程。master进程负责管理Worker进程,如果一个worker进程意外退出,master会启动一个新的进程。

这台服务器上有2个主进程:

前面一个主进程1176和它的2个工作子进程1830和1831是安装花生壳是安装的和我们的Web服务无关,不管它了。

后面的一个主进程4544和它的工作进程4545是我们启动用了做Web服务的。

在配置文件nginx.conf中可以设置进程数和连接数,我们来看看相关部分。

查找nginx.conf的位置:

sudo find / -name nginx.conf

nginx支持stream nginx支持cgi_Ubuntu Lnux_05

我们的配置文件是:/usr/local/nginx/conf/nginx.conf

cat /usr/local/nginx/conf/nginx.conf

nginx支持stream nginx支持cgi_CGI_06

使用工作进程的用户是nobody。

worker_processes指明了nginx要开启的进程数,worker_processes默认情况下为1,一般情况下不用修改。

每个worker进程的最大连接数由worker_connections指定,这里是1024。

2.4 测试

在浏览器地址栏输入http://192.168.1.8

 

nginx支持stream nginx支持cgi_CGI_07

默认页面index.html在/usr/local/nginx/html目录下。

3. 让Nginx支持CGI

Nginx不能直接执行CGI程序,CGI程序可以通过FastCGI接口来调用。为了调用CGI程序,我们需要一个FastCGI的包装器wrapper,这个wrapper绑定在某个端口上。当nginx将CGI请求发送给这个端口时,wrapper接纳请求并fork一个新的线程,这个线程调用CGI程序并读取返回值,wrapper再将返回的数据通过绑定的端口传递给 Nginx。

3.1 安装spawn-fcgi

spawn-fcgi是通用FastCGI进程管理器,用来运行fcgiwrap。

sudo apt-get install spawn-fcgi

nginx支持stream nginx支持cgi_nginx支持stream_08

3.2 安装fcgiwrap

Github网址:https://github.com/gnosek/fcgiwrap

Fcgiwrap是CGI脚本的FastCGI包装器。

sudo apt-get install fcgiwrap

nginx支持stream nginx支持cgi_nginx支持stream_09

fcgiwrap的安装位置:sudo find / -name fcgiwrap

nginx支持stream nginx支持cgi_nginx_10

3.3启动spawn-fcgi管理fcgiwrap进程

  • 绑定服务IP和端口,指定fcgiwrap目录

spawn-fcgi -a 127.0.0.1 -p 8888 -f /usr/sbin/fcgiwrap

nginx支持stream nginx支持cgi_nginx_11

  • 查看8888端口

netstat -na | grep 8888

nginx支持stream nginx支持cgi_CGI_12

sudo netstat -tlnp | grep fcgiwrap

nginx支持stream nginx支持cgi_Ubuntu Lnux_13

  • 查看进程

ps -ef | grep fcgi

nginx支持stream nginx支持cgi_Ubuntu Lnux_14

3.4 WWW根目录和CGI目录

在前面的配置文件/etc/nginx/sites-available/default 中我们看到Nginx的www默认根目录为/usr/local/nginx/html。

  • 我们创建自己的WWW根目录和CGI目录

sudo mkdir /var/www

sudo mkdir /var/www/cgi-bin

  • 在目录/var/www下创建测试页面test.html

nginx支持stream nginx支持cgi_CGI_15

<html>
<body>
<h1>Hello world!</h1>
</body>
</html>
  • 在/var/www/cgi-bin目录下创建了一个测试cgi文件test.cgi

cd /var/www/cgi-bin

sudo nano test.c

nginx支持stream nginx支持cgi_CGI_16

#include <stdio.h>

int main(void)
{
    printf("Content-Type:text/plain;charset=us-ascii\n\n");
    printf("Hello World\n\n");
    return 0;
}

编译:

sudo gcc -o test.cgi test.c

nginx支持stream nginx支持cgi_nginx_17

nginx支持stream nginx支持cgi_Ubuntu Lnux_18

3.5 修改nginx.conf设置WWW根目录

更改nginx.conf配置文件,让nginx转发请求。

  • 先备份一下nginx.conf

sudo cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf-bak

nginx支持stream nginx支持cgi_CGI_19

  • 修改nginx.conf

sudo nano /usr/local/nginx/conf/nginx.conf

nginx支持stream nginx支持cgi_CGI_20

找到:

nginx支持stream nginx支持cgi_nginx支持stream_21

修改成:

nginx支持stream nginx支持cgi_Ubuntu Lnux_22

  • 检查配置文件是否正确

sudo /usr/local/nginx/sbin/nginx -t

nginx支持stream nginx支持cgi_CGI_23

3.6重新加载配置文件

udo /usr/local/nginx/sbin/nginx -s reload

3.7 测试

在浏览器地址栏输入http://192.168.1.8/test.html

nginx支持stream nginx支持cgi_nginx支持stream_24

3.8 修改nginx.conf设置CGI

  • 在server块中添加红框部分

nginx支持stream nginx支持cgi_nginx支持stream_25

  • 检查配置文件是否正确

sudo /usr/local/nginx/sbin/nginx -t

  • 重新加载配置文件

sudo /usr/local/nginx/sbin/nginx -s reload

3.9 测试

在浏览器地址栏输入http://192.168.1.8/cgi-bin/test.cgi

nginx支持stream nginx支持cgi_nginx_26

成功!

3.10 开机启动fcgiwrap

  • 修改rc-local.service文件

先找到rc-local.service文件

sudo find / -name rc-local.service

nginx支持stream nginx支持cgi_nginx支持stream_27

编辑rc-local.service

sudo nano /lib/systemd/system/rc-local.service

nginx支持stream nginx支持cgi_nginx支持stream_28

添加

[Install]
WantedBy=multi-user.target
Alias=rc-local.service

  • 创建/etc/rc.local文件

Ubuntu18.04没有/etc/rc.local,建立一个。

sudo nano /etc/rc.local

nginx支持stream nginx支持cgi_Nginx_29

#!/bin/sh -e
# startup fcgiwrap
su ccdc -c "spawn-fcgi -a 127.0.0.1 -p 8888 -f /usr/sbin/fcgiwrap"

exit 0
  • 修改权限

sudo chmod 755 /etc/rc.local

  • 重启系统

sudo reboot