centos+nginx+c

来源:互联网 发布:潘家园配眼镜 知乎 编辑:程序博客网 时间:2024/06/06 11:25
标题: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 -lfcgi 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
0 0