nginx+fastcgi+c++/php搭建web服务

- 1.Nginx

  • 1.1.安装

    $sudo apt-get install nginx
    ubuntu安装Nginx之后的文件结构大致为:
    所有的配置文件都在/etc/nginx下,并且每个虚拟主机已经安排在了/etc/nginx/sites-available下
    启动程序文件在/usr/sbin/nginx
    日志放在了/var/log/nginx中,分别是access.log和error.log
    并已经在/etc/init.d/下创建了启动脚本nginx
    默认的虚拟主机的目录设置在了/usr/share/nginx/html

  • 1.2查看是否启动成功

ps -ef|grep nginx

nginx+fastcgi+c++/php搭建web服务_第1张图片
可以看出有一个master进程和4个worker进程。
用浏览器可以测试nginx安装是否成功。

-2. FastCGI

  • 2.1.安装lighttpd的spawn-fastcgi

http://www.lighttpd.net/download/spawn-fcgi-1.6.3.tar.gz
解压缩以后,进入目录下执行如下安装命令:

$./configure
$make
cp ./src/spawn-fcgi /usr/sbin/

安装之后,spawn-fcgi命令就可以直接使用了,它的可执行文件在/usr/sbin/spawn-fcgi。

  • 2.2.安装fastcgi库

写fastcgi程序还需要fastcgi的库和头文件支持(就好像写多线程程序需要-lpthread一样)
下载地址:http://pkgs.fedoraproject.org/repo/pkgs/fcgi/fcgi-2.4.0.tar.gz/d15060a813b91383a9f3c66faf84867e/

./configure
make
make install

注意安装会报错
fcgio.cpp:50: error: ‘EOF’ was not declared in this scope
解决办法:
在/include/fcgio.h文件中加上 #include <cstdio>,然后再编译安装就通过了。

  • 2.3.Hello world
#include <iostream>
#include <unistd.h>
#include <stdlib.h>
#include <fcgi_stdio.h>

using namespace std;
int main()
{
    /* Initialization Code */
    int count = 0;
    /* Start of response loop */
    while (FCGI_Accept() >= 0)
    {
        //* body of response loop /*/
        FCGI_printf("Content-type: text/html\r\n\r\n"
                "FastCGI Hello,ZHB! (C, fcgi_stdio library)"
                "\nRequest number %d running on host %s "
                "Process ID: %d\n",
                ++count,
                getenv("SERVER_NAME"), getpid());
    }
    /* End of response loop */
    return 0;
}

特别注意:不能用c语言中的printf函数,要用FCGI_printf函数。另外输出的第一行要符合http包头格式:Content-type: text/html\r\n\r\n,否则都会出现502错误。

编译后为FastCGISameple
g++ fcgi.cpp -o fcgisample -lfcgi

测试程序是否能正常运行:./fcgisample,如果能正常运行则说明程序没有问题,如果出现缺少库libfcgi.so.0,则自己需要手动把/usr/local/lib/libfcgi.so.0库建立一个链接到/usr/lib/目录下:ln -s /usr/local/libfcgi.so.0 /usr/lib/

  • 2.4.启动Spawn-cgi

cd /usr/sbin
sudo ./spawn-fcgi -a 127.0.0.1 -p 9000 -C 25 -f /export/servers/nginx/fcgisample
上面命令参数中,-p指定FastCGI进程管理器监听的端口号,-F指定spawn-fcgi将fork多少个child进程(之后Nginx对于此cgi的请求就可以并发处理了,这里默认是一个进程)。
查看一下9000端口是否已成功:netstat -na | grep 9000

  • 2.5.修改Nginx配置文件

vim /etc/nginx/nginx.conf
在http{ }里添加:

server {
        listen 8081;

        location / {
            root /export/servers/nginx;
            index index.html;
        }

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

这里配置的端口号是8081,如果不配置的话,会与nginx默认的80端口搞混乱,出现404错误。
别忘了,重新加载配置文件(1430是nginx主进程号)
$sudo kill -HUP 1430
或者重启nginx
./nginx -s reload

  • 2.6 运行结果

nginx+fastcgi+c++/php搭建web服务_第2张图片

3. php+nginx配置

如C++一样,nginx需要fastcgi才能解析php,php中的fastcgi用的最多的就是PHP-FPM。
PHP5可以在nginx上通过PHP-FPM(PHP—FPM(FastCGI Process Manager) 是一个可选的 FastCGI。 说明:Nginx不支持对外部程序的直接调用或解析,所有的外部程序(包括PHP)必须通过FastCGI接口调用。
sudo apt-get install php5-fpm
PHP-FPM是一个守护进程(init脚本文件在/etc/init.d/php5-fpm),它运行了一个FastCGI server,它对应的socket文件在/var/run/php5-fpm.sock。
在nginx加入如下配置:

location ~ \.php$ {
    root /export/servers/nginx;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
    include fastcgi_params;
}

root的路径是php文件所在路径,
fastcgi_pass是php-fpm的socket文件,也可以用127.0.0.1:9000,9000是php-fpm进程的端口号
fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;这个配置指定了脚本名对应的文件名,如访问localhost/index.php,即访问的是root路径下的index.php文件。
运行结果:

你可能感兴趣的:(nginx+fastcgi+c++/php搭建web服务)