昔我往矣

Nginx下配置C和Python的cgi程序实例

2012年10月17日

先来理解一下什么是cgi:
Common Gateway Interface,简称CGI。在物理上是一段程序,运行在服务器上,提供同客户端HTML页面的接口。(百度百科)

我使用的是Nginx+FastCGI支持C语言程序,使用Nginx+uwsgi支持Python的cgi程序。下面是详细的步骤。(下面的操作我均是用root权限做的,如果您使用普通权限出现错误的时候,可以尝试使用root权限操作)

第一部分:Nginx与FastCGI
一、安装Nginx环境
1、配置所有Nginx需要的依赖软件包。pcre、zlib、libssl等。

# apt-get install libpcre3* zlib1g libssl* make gcc

2、下载Nginx软件包。

# wget http://nginx.org/download/nginx-1.2.1.tar.gz

3、安装Nginx

# tar zxvf nginx-1.2.1.tar.gz
# cd nginx-1.2.1/
# ./configure
# make
# make install 

友情提示:./configure和make可以使用普通用户权限就完成,但是,make install必须使用超级用户权限,下同.
Nginx默认会被/usr/local/nginx目录下。

4、/usr/local/nginx/sbin/nginx即为启动程序。有如下常用参数:

-c 为nginx指定一个配置文件,来代替缺省的配置文件。
-v 显示nginx的版本。
-V 显示nginx的详细版本信息。
-s 发送信号,可用的有:stop,quit,reopen,reload
-t 不运行,仅仅测试配置文件,检查语法的正确性。

启动程序的时候可能会出现类似的错误:

/usr/local/nginx/sbin/nginx: error while loading shared libraries: libpcre.so.0: cannot open ?shared object file: No such file or directory,

解决办法:

# ln -s /usr/local/lib/libpcre.so.0 /usr/lib/libpcre.so.0

5、察看nginx主程序的进程号:

# ps aux | grep "nginx: master" | grep -v "grep"|awk '{print $2}'

# cat /usr/local/nginx/logs/nginx.pid

6、重新加载nginx的配置文件:

# kill -HUP PID

# nginx -s reload
  • nginx的配置文件目录:/usr/local/nginx/conf
  • nginx的WEB文件目录:/usr/local/nginx/html
  • nginx可执行文件的目录:/usr/local/nginx/sbin
  • 可以运行/usr/local/nginx/sbin/nginx来启动nginx,并使用浏览器来测试nginx是否安装和启动成功,如果看到"Welcome to nginx!"的欢迎页面,则表示已经成功完成nginx的安装和启动。

二、安装FastCGI
1、下载安装包:wget http://www.lighttpd.net/download/spawn-fcgi-1.6.0.tar.gz
2、下载安装包:wget http://www.fastcgi.com/dist/fcgi.tar.gz
3、安装fcgi包

# tar zxvf fcgi.tar.gz
# cd fcgi-2.4.1-SNAP-0311112127/
# ./configure
# make
# make install

如果出现关于fcgio.cpp文件的EOF的错误,需要在./libfcgi/fcgio.cpp的文件头地方,加入

#include <stdio.h>

然后再进行安装过程。

4、安装spawn-fcgi

# tar zxvf spawn-fcgi-1.6.0.tar.gz
# cd spawn-fcgi-1.6.0/
# ./configure
# make
# make install

三、编写C的web脚本
1、编写如下测试程序,保存为a.c

#include <iostream>
#include <stdlib.h>
#include <fcgi_stdio.h>
using namespace std;
int main(){
int count = 0;

while (FCGI_Accept() &gt;= 0)
{
printf("Content-type: text/html\r\n"
"\r\n"
"FastCGI Hello! (C, fcgi_stdio library)"
"Request number %d running on host %s "
"Process ID: %d\n",
++count,
getenv("SERVER_NAME"), getpid());
}

return 0;
}

2、编译:g++ -o hello a.c -lfcgi
3、将编译出来的二进制文件hello,拷贝到/usr/local/nginx/fastcgi目录下,如果没有这个目录、可以自己新建,下面会用到这个文件。

四、修改nginx的配置文件
1、vim /usr/local/nginx/conf/nginx.conf
2、 添加如下几行:

location ~ \.cgi$
{
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.cgi;
    fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
    include fastcgi_params;
}

3、保存退出
4、重新加载nginx配置文件nginx -s reload。

五、启动hello

# spawn-fcgi -a 127.0.0.1 -p 9000 -C25 -u www-data -f /usr/local/nginx/fastcgi/hello

如果出现spawn-fcgi: child exited with: 127 提示,则:

# ln -s /usr/local/lib/libfcgi.so.0 /usr/lib/libfcgi.so.0

查看效果,http://ip/111.cgi,将会看到如下结果

FastCGI Hello! (C, fcgi_stdio library)Request number 1 running on host localhost Process ID: 29770

第二部分 Nginx与uwsgi

一、安装依赖和uwsgi

# apt-get install python-setuptools
# apt-get install python-dev    
# wget uwsgi:wget http://projects.unbit.it/downloads/uwsgi-latest.tar.gz
# tar zxvf uwsgi-latest.tar.gz
# cd uwsgi-1.2.4/
# python setup.py build
# make 
# cp uwsgi /usr/bin

二、配置Nginx

# vim /usr/local/nginx/conf/nginx.conf

location / {
            root   html;
            uwsgi_pass 127.0.0.1:9001;
            include uwsgi_params;
        }

把另外一个

location /{
    ...
}

注释掉

三、编写python测试脚本

# cat /usr/local/nginx/html/hello.py

#!/usr/bin/python

def application(environ,start_response):
        start_response('200 OK',[('Content-Type','text/plain')])
        yield 'Hello Wrold....'

四、启动nginx和uwsgi

1、启动nginx: nginx
2、cd /usr/local/nginx/html
3、启动uwsgi:uwsgi -s 127.0.0.1:9001 -C -w hello (最好把uwsgi二进制文件拷贝一份到保存python文件的目录下,然后使用./uwsgi方式执行)。
4、另外一种启动uwsgi的方法,编写xml文件。如下app.xml

<uwsgi>
  <socket>127.0.0.1:9001</socket>
  <module>hello</module>
  <processes>4</processes>
  <master/>
</uwsgi>

启动方式:./uwsgi -x app.xml 功能同上。

完成以上步骤,尝试在浏览器中输入:http://ip/ 会转到python的web页面,使用http://ip/123.cgi 会转到c的web页面程序。

当前暂无评论 »

添加新评论 »