标题:centos+nginx+c
日期:2015-9-7
作者:kagula
环境:CentOS 6.6 32位、spawn-fcgi 1.6.3、nginx 1.8.0、gcc 4.4.7
测试:centos下nginx调用C写的fastcgi程序的技术可行性。
安装nginx
baidu下,缺省路径安装。
ps -uax|grep nginx
可以查看nginx的目录。
nginx会在下面的路径下建立临时路径
/var/cache/nginx/
安装spawn-fcgi
tar -zvxf spawn-fcgi-1.6.3.tar.gz
cd spawn-fcgi-1.6.3
./configure && make && make install
缺省安装目录在/usr/local/bin中。
安装fastcgi库
wget http://www.fastcgi.com/dist/fcgi.tar.gz
./configure
make
make install
缺省路径在“/usr/local/include” and “/usr/local/lib”。
为CentOS添加动态链接库search路径
vi /etc/ld.so.conf
这里需要添加对“/usr/local/lib”路径的搜索。
每个路径占一行,修改好后用下面的命令
ldconfig -v
重新加载动态链接库
没有这一步,写好的cgi程序会找不到so文件。
编译我们的fcgi程序
假设我的hello.c在当前目录下,可以使用下面的命令编译出“hello”程序。
gcc -I
/usr/local/include -L
/usr/local/lib -l
fcgi hello.c -o hello
上面命令中的fcgi指的是
/usr/local/lib/libfcgi.so动态库文件。
使用spawn-fcgi运行我们的hello进程。如果没有修改默认权限,那需要root权限.
spawn-fcgi -a 127.0.0.1 -p 7000 -f /home/kagula/hello
发现用telnet是连不上7000端口的,但是可以用netstat -nap|grep 7000命令找到它。
参数a后面跟要绑定的IP地址
参数p后面跟要绑定的TCP端口
参数f后面跟要绑定的cgi程序
我们需要改变spawn-fcgi文件的属主为“nginx”,它是nginx的默认用户名。
nginx要access的进程、文件包括文件夹它们的属主都应该为
nginx用户。
修改/etc/nginx/nginx.conf文件的第一行从“user
nginx;”改为“user root;”
配置nginx做url跳转
/etc/nginx/nginx.conf文件会引用/etc/nginx/conf.d目录下面的所有conf文件。
复制/etc/nginx/conf.d/default.conf文件为kagula.conf,把下面的代码
嵌入到kagula.conf文件的server标记中。
location ~ \.cgi$
{
fastcgi_pass 127.0.0.1:7000;
fastcgi_index index.cgi;
include fastcgi_params;
}
把default.conf文件重命名为default.conf.bak
现在如果访问的url为192.168.159.200/XX.cgi请求都会转到127.0.0.1:7000上去。
这里熟悉下/etc/nginx/nginx.conf和/etc/nginx/conf.d/default.conf文件的内容。
查找端口号为7000的进程并停止它
netstat -nap|grep 7000
找到pid后用kill命令杀死。
查看nginx工作进程的运行用户
ps aux | grep "nginx: worker process" | awk '{print $1}'
关闭SELINUX
vi /etc/selinux/config
#SELINUX=enforcing #注释掉
#SELINUXTYPE=targeted #注释掉
SELINUX=disabled #增加
:wq! #保存退出
setenforce 0 #使配置立即生效
不关闭会导致“permission denied”的错误。
备注:
[1]看了下spawn-gcgi 1.6.3、1.6.4源码发现不支持windows平台。
[2]netstat命令可以帮到我们查到当前正在使用的端口信息:
netstat -t参数:t代表TCP协议的套节字链接,除了t之外还有u(UDP)、w(RAW)、x(UNIX)套节字。
netstat -a参数:a就是(all)简写,意思就是包括全部正在监听的端口。
netstat -n参数:直接显示端口号,不是根据“/etc/server”显示端口对应的服务名称。
netstat -p参数:显示占用该端口号的进程。
netstat -l参数:显示正在被监听的端口。
[3]附hello.c源码
#include <fcgi_stdio.h>
int main(int argc,char* argv[])
{
while(FCGI_Accept()>=0)
{
FCGI_printf("Status: 200 OK\r\n");
FCGI_printf("Content-Type:text/html\r\n\r\n");
FCGI_printf("Hello world\n");
}
return 0;
}
[4]可以使用命令“gcc --version”查看gcc的版本。
参考资料
[1] spawn-gcgi download
http://redmine.lighttpd.net/projects/spawn-fcgi/wiki/
[2]
部署 GitLab 到最后配置 nginx 碰到权限问题
https://ruby-china.org/topics/5113