陈拓 2020.10.20/2020.10.21
1. 概述
在《树莓安装Nginx并支持CGI》
一文中我们在树莓派上安装了Nginx并设置了CGI的支持。本文在Ubuntu系统上设置CGI支持。
树莓派的官方系统和Ubuntu都是基于Debian发行版,所以设置是一样的。
查看系统内核版本号:
uname -a
Ubuntu版本号
cat /etc/issue
2. 设置
- 登录Ubuntu服务器
可以用putty,也可以用Windows 10内置的SSH客户端,我们就用它吧。服务器上已经创建了用户ct,服务器的IP地址是92.168.1.8。
ssh ct@192.168.1.8
- 查看Nginx进程
ps -ef | grep nginx
master是主进程,worker是工作进程。master进程负责管理Worker进程,如果一个worker进程意外退出,master会启动一个新的进程。
这台服务器上有2个主进程:
前面一个主进程1176和它的2个工作子进程1830和1831是安装花生壳是安装的和我们的Web服务无关,不管它了。
后面的一个主进程4544和它的工作进程4545是我们启动用了做Web服务的。
在配置文件nginx.conf中可以设置进程数和连接数,我们来看看相关部分。
查找nginx.conf的位置:
sudo find / -name nginx.conf
我们的配置文件是:/usr/local/nginx/conf/nginx.conf
cat /usr/local/nginx/conf/nginx.conf
使用工作进程的用户是nobody。
worker_processes指明了nginx要开启的进程数,worker_processes默认情况下为1,一般情况下不用修改。
每个worker进程的最大连接数由worker_connections指定,这里是1024。
2.4 测试
在浏览器地址栏输入http://192.168.1.8
默认页面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
3.2 安装fcgiwrap
Github网址:https://github.com/gnosek/fcgiwrap
Fcgiwrap是CGI脚本的FastCGI包装器。
sudo apt-get install fcgiwrap
fcgiwrap的安装位置:sudo find / -name fcgiwrap
3.3启动spawn-fcgi管理fcgiwrap进程
- 绑定服务IP和端口,指定fcgiwrap目录
spawn-fcgi -a 127.0.0.1 -p 8888 -f /usr/sbin/fcgiwrap
- 查看8888端口
netstat -na | grep 8888
sudo netstat -tlnp | grep fcgiwrap
- 查看进程
ps -ef | grep fcgi
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
<html>
<body>
<h1>Hello world!</h1>
</body>
</html>
- 在/var/www/cgi-bin目录下创建了一个测试cgi文件test.cgi
cd /var/www/cgi-bin
sudo nano test.c
#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
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.conf
sudo nano /usr/local/nginx/conf/nginx.conf
找到:
修改成:
- 检查配置文件是否正确
sudo /usr/local/nginx/sbin/nginx -t
3.6重新加载配置文件
udo /usr/local/nginx/sbin/nginx -s reload
3.7 测试
在浏览器地址栏输入http://192.168.1.8/test.html
3.8 修改nginx.conf设置CGI
- 在server块中添加红框部分
- 检查配置文件是否正确
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
成功!
3.10 开机启动fcgiwrap
- 修改rc-local.service文件
先找到rc-local.service文件
sudo find / -name rc-local.service
编辑rc-local.service
sudo nano /lib/systemd/system/rc-local.service
添加
[Install]
WantedBy=multi-user.target
Alias=rc-local.service
- 创建/etc/rc.local文件
Ubuntu18.04没有/etc/rc.local,建立一个。
sudo nano /etc/rc.local
#!/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