利用C语言制作网站

简介: 利用C语言制作网站


进入终端后,我们先尝试ls命令

ls

ls命令,是显示目录内的文件,类似CMD中的dir。和powershell中的ls类似。

582a17950d0798d503e036256113cfe75bb184b5


如果没有nginx-1.6.0.sh这份文件,我们可以运行一下VIM把下面的文件保存为nginx-1.6.0.sh


#!/bin/bash

SRC_URI="http://t-down.oss-cn-hangzhou.aliyuncs.com/nginx-1.6.0.tar.gz"
PKG_NAME=`basename $SRC_URI`
PKG_NAME_DIR=nginx-1.6.0
PREFIX=/alidata/nginx
LOGS=$PREFIX/logs
VHOSTS=$PREFIX/conf/vhosts
DIR=`pwd`
DATE=`date +%Y%m%d%H%M%S`
CPU_NUM=$(cat /proc/cpuinfo | grep processor | wc -l)

\mv $PREFIX ${PREFIX}.bak.$DATE &> /dev/null
mkdir -p $PREFIX
mkdir -p $VHOSTS
mkdir -p /alidata/install

####---- user add ----begin####
groupadd www &> /dev/null
useradd -g www -M -d /alidata/www -s /sbin/nologin www &> /dev/null
####---- user add ----end####
cd /alidata/install

if [ ! -s $PKG_NAME ]; then
  wget -c $SRC_URI
fi

####---- install dependencies ----begin####
if [ "$(cat /proc/version | grep redhat)" != "" ];then
  wget http://git.jiagouyun.com/operation/operation/raw/master/linux/redhat/CentOS-Base.repo -O /etc/yum.repos.d/CentOS-Base.repo
  yum makecache
  yum -y install gcc gcc-c++ gcc-g77 make unzip automake openssl openssl-devel curl curl-devel pcre-devel
elif [ "$(cat /proc/version | grep centos)" != "" ];then
#note : The CentOS 5 series, Yum will install 32 bit packet, then filter out 32.
  if [ `uname -m` == "x86_64" ];then
	  if cat /etc/issue |grep "5\." &> /dev/null;then
		 if ! cat /etc/yum.conf |grep "exclude=\*\.i?86" &> /dev/null;then
			sed -i 's;\[main\];\[main\]\nexclude=*.i?86;' /etc/yum.conf
		 fi
		 rpm --import /etc/pki/rpm-gpg/RPM*
	  fi
  fi
  yum makecache
  yum -y install gcc gcc-c++ gcc-g77 make unzip automake openssl openssl-devel curl curl-devel pcre-devel
elif [ "$(cat /proc/version | grep ubuntu)" != "" ];then
  sed -i 's/exit 0//' /etc/rc.local
  apt-get -y update
  apt-get -y install unzip libcurl4-openssl-dev libpcre3-dev 
elif [ "$(cat /proc/version | grep -i debian)" != "" ];then
  apt-get -y update
  apt-get -y install unzip libcurl4-openssl-dev libpcre3-dev
fi
####---- install dependencies ----end####

######----- install ----begin######
rm -rf $PKG_NAME_DIR
tar zxvf $PKG_NAME
cd $PKG_NAME_DIR
./configure --user=www \
--group=www \
--prefix=$PREFIX \
--with-http_stub_status_module \
--without-http-cache \
--with-http_ssl_module \
--with-http_gzip_static_module
if [ $CPU_NUM -gt 1 ];then
    make -j$CPU_NUM
else
    make
fi
make install
######---- install ----end######

cat > $PREFIX/conf/nginx.conf << EOF
user  www www;
worker_processes  2;

error_log  $LOGS/error.log crit;
pid        $LOGS/nginx.pid;

#Specifies the value for maximum file descriptors that can be opened by this process. 
worker_rlimit_nofile 65535;

events 
{
  use epoll;
  worker_connections 65535;
}


http {
	include       mime.types;
	default_type  application/octet-stream;

	#charset  gb2312;

	server_names_hash_bucket_size 128;
	client_header_buffer_size 32k;
	large_client_header_buffers 4 32k;
	client_max_body_size 8m;

	sendfile on;
	tcp_nopush     on;

	keepalive_timeout 60;

	tcp_nodelay on;

	fastcgi_connect_timeout 300;
	fastcgi_send_timeout 300;
	fastcgi_read_timeout 300;
	fastcgi_buffer_size 64k;
	fastcgi_buffers 4 64k;
	fastcgi_busy_buffers_size 128k;
	fastcgi_temp_file_write_size 128k;

	gzip on;
	gzip_min_length  1k;
	gzip_buffers     4 16k;
	gzip_http_version 1.0;
	gzip_comp_level 2;
	gzip_types       text/plain application/x-javascript text/css application/xml;
	gzip_vary on;
	#limit_zone  crawler  \$binary_remote_addr  10m;
	log_format main '\$remote_addr - \$remote_user [\$time_local] "\$request" '
	              '\$status \$body_bytes_sent "\$http_referer" '
	              '"\$http_user_agent" "\$http_x_forwarded_for"';
	include $VHOSTS/*.conf;
}
EOF

mkdir -p /alidata/www/default
echo '<html><head><title>Welcome to nginx!</title></head><body bgcolor="white" text="black"><center><h1>Welcome to nginx!</h1></center></body></html>' > /alidata/www/default/index.html
chown www:www /alidata/www/default/index.html
cat > $VHOSTS/default.conf << EOF
server {
    listen       80 default;
    server_name  _;
	#index.php or index.jsp ???
    index index.html index.htm;
    root /alidata/www/default;
	####<<<PHP settings>>>####
	#location ~ .*\.(php|php5)?$
	#{
	#	fastcgi_pass  127.0.0.1:9000;
	#	fastcgi_index index.php;
	#	include fastcgi.conf;
	#}
	
    ####<<<Tomcat settings>>>####
    #location / {  
	#or : location ~ \.jsp\$ {
	#	proxy_pass http://server:8080;
	#	proxy_set_header        Host \$host;
	#	proxy_set_header        X-Real-IP \$remote_addr;
	#	proxy_set_header        X-Forwarded-For \$proxy_add_x_forwarded_for;
    #}
	
    ####<<<Cache settings>>>####
	location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
	{
		expires 1d;
	}
	location ~ .*\.(js|css)?$
	{
		expires 1d;
	}
	####<<<The log path set>>>####
	access_log  $LOGS/default.log;
}
EOF

echo '#!/bin/bash' >> /etc/init.d/nginx
cat > /etc/init.d/nginx << EOF
# nginx Startup script for the Nginx HTTP Server
# this script create it by ruijie. at 2014.02.26
# if you find any errors on this scripts,please contact ruijie.
# and send mail to ruijie at gmail dot com.
#            ruijie.qiao@gmail.com

nginxd=$PREFIX/sbin/nginx
nginx_config=$PREFIX/conf/nginx.conf
nginx_pid=$PREFIX/logs/nginx.pid

RETVAL=0
prog="nginx"

[ -x \$nginxd ] || exit 0

# Start nginx daemons functions.
start() {
    
    if [ -e \$nginx_pid ] && netstat -tunpl | grep nginx &> /dev/null;then
        echo "nginx already running...."
        exit 1
    fi
        
    echo -n \$"Starting \$prog!"
    \$nginxd -c \${nginx_config}
    RETVAL=\$?
    echo
    [ \$RETVAL = 0 ] && touch /var/lock/nginx
    return \$RETVAL
}


# Stop nginx daemons functions.
stop() {
    echo -n \$"Stopping \$prog!"
    \$nginxd -s stop
    RETVAL=\$?
    echo
    [ \$RETVAL = 0 ] && rm -f /var/lock/nginx
}


# reload nginx service functions.
reload() {

    echo -n \$"Reloading $prog!"
    #kill -HUP \`cat \${nginx_pid}\`
    \$nginxd -s reload
    RETVAL=\$?
    echo

}

# See how we were called.
case "\$1" in
start)
        start
        ;;

stop)
        stop
        ;;

reload)
        reload
        ;;

restart)
        stop
        start
        ;;

*)
        echo \$"Usage: $prog {start|stop|restart|reload|help}"
        exit 1
esac

exit \$RETVAL
EOF
chmod 755 /etc/init.d/nginx

chown -R www:www $LOGS
chmod -R 775 /alidata/www
chown -R www:www /alidata/www
cd ..
sed -i 's/worker_processes  2/worker_processes  '"$CPU_NUM"'/' $PREFIX/conf/nginx.conf
chmod 755 $PREFIX/sbin/nginx

#add PATH
if ! cat /etc/profile | grep "export PATH=\$PATH:$PREFIX/sbin" &> /dev/null;then
	echo "export PATH=\$PATH:$PREFIX/sbin" >> /etc/profile
fi
source /etc/profile
#add rc.local
if ! cat /etc/rc.local | grep "/etc/init.d/nginx start" &> /dev/null;then
    echo "/etc/init.d/nginx start" >> /etc/rc.local
fi
/etc/init.d/nginx start
cd $DIR
bash

然后,我们需要更改文件的运行权限
chmod +x nginx-1.6.0.sh

然后在运行nginx-1.6.0.sh文件
./nginx-1.6.0.sh

等待运行结束,可以看到这个界面

这个时候,我们再浏览一下IP,可以看到

则证明nginx安装成功。


接下来我们需要安装一下spawn-fcgi和fcgi,在shell界面下执行
yum -y install spawn-fcgi
yum -y install fcgi-devel

切换到网站运行目录
cd /alidata/www/default/
新建一份C文件
vim a.cpp
按下i进入编辑模式

#include "fcgi_stdio.h"
#include <stdlib.h>
#include <stdio.h>

int main()
{
    while(FCGI_Accept() >= 0)     
    {
		printf("Content-type: text/*\r\n\r\n"); 
		printf("欢迎来到由阿里云运行的C语言");
    }
   return 0;
}


按下ESC退出编辑模式,输入

:wq

保存及退出VIM

编译这个文件

g++ a.cpp -o index.aliC -lfcgi

等待完成后,我们就可以去编译我们的C语言了

接下来,把文件替换一下,因aliyun是经过优化的,我们需要他原来的那份默认配置编辑

\cp -rf /alidata/nginx/conf/nginx.conf.default /alidata/nginx/conf/nginx.conf

运行VIM编辑文件并定位到第65行

vim /alidata/nginx/conf/nginx.conf +65


轻轻按下ctrl+v,进入编辑模式

按j选中我们要修改代码的注释

然后再按D删除注释

选到第65行,按i进入编辑模式把php改为aliC

同时,找到第66,68,69,70行可以删除,不删也没关系。

按下ESC然后输入:wq保存及退出

:wq

Center

最后重启nginx

nginx -s reload

或者

killall nginx

nginx


最后,运行一下

spawn-fcgi -f /alidata/www/default/index.aliC -p 9000

看到如下提示证明成功了

20170216191658252


接下来运行浏览器,打开http://localhost/index.aliC,或者执行

curl http://localhost/index.aliC

或者

curl http://127.0.0.1/index.aliC

即可看到如下结果

20170216192037070




遇到的问题及解决方案

曾经遇到spawn-fcgi返回child exited with: 0的问题,经过搜索,解决方案很少,几乎找不到。

经过排查,发现是C的源码问题。需要加上


    while(FCGI_Accept() >= 0) 
这句代码才能正常运行。

目录
相关文章
|
4月前
|
数据采集 存储 测试技术
C语言高效的网络爬虫:实现对新闻网站的全面爬取
C语言高效的网络爬虫:实现对新闻网站的全面爬取
|
8天前
|
存储 Serverless C语言
【C语言基础考研向】11 gets函数与puts函数及str系列字符串操作函数
本文介绍了C语言中的`gets`和`puts`函数,`gets`用于从标准输入读取字符串直至换行符,并自动添加字符串结束标志`\0`。`puts`则用于向标准输出打印字符串并自动换行。此外,文章还详细讲解了`str`系列字符串操作函数,包括统计字符串长度的`strlen`、复制字符串的`strcpy`、比较字符串的`strcmp`以及拼接字符串的`strcat`。通过示例代码展示了这些函数的具体应用及注意事项。
|
11天前
|
存储 C语言
C语言程序设计核心详解 第十章:位运算和c语言文件操作详解_文件操作函数
本文详细介绍了C语言中的位运算和文件操作。位运算包括按位与、或、异或、取反、左移和右移等六种运算符及其复合赋值运算符,每种运算符的功能和应用场景都有具体说明。文件操作部分则涵盖了文件的概念、分类、文件类型指针、文件的打开与关闭、读写操作及当前读写位置的调整等内容,提供了丰富的示例帮助理解。通过对本文的学习,读者可以全面掌握C语言中的位运算和文件处理技术。
|
11天前
|
存储 C语言
C语言程序设计核心详解 第七章 函数和预编译命令
本章介绍C语言中的函数定义与使用,以及预编译命令。主要内容包括函数的定义格式、调用方式和示例分析。C程序结构分为`main()`单框架或多子函数框架。函数不能嵌套定义但可互相调用。变量具有类型、作用范围和存储类别三种属性,其中作用范围分为局部和全局。预编译命令包括文件包含和宏定义,宏定义分为无参和带参两种形式。此外,还介绍了变量的存储类别及其特点。通过实例详细解析了函数调用过程及宏定义的应用。
|
17天前
|
Linux C语言
C语言 多进程编程(三)信号处理方式和自定义处理函数
本文详细介绍了Linux系统中进程间通信的关键机制——信号。首先解释了信号作为一种异步通知机制的特点及其主要来源,接着列举了常见的信号类型及其定义。文章进一步探讨了信号的处理流程和Linux中处理信号的方式,包括忽略信号、捕捉信号以及执行默认操作。此外,通过具体示例演示了如何创建子进程并通过信号进行控制。最后,讲解了如何通过`signal`函数自定义信号处理函数,并提供了完整的示例代码,展示了父子进程之间通过信号进行通信的过程。
|
16天前
|
C语言
C语言 字符串操作函数
本文档详细介绍了多个常用的字符串操作函数,包括 `strlen`、`strcpy`、`strncpy`、`strcat`、`strncat`、`strcmp`、`strncpy`、`sprintf`、`itoa`、`strchr`、`strspn`、`strcspn`、`strstr` 和 `strtok`。每个函数均提供了语法说明、参数解释、返回值描述及示例代码。此外,还给出了部分函数的自实现版本,帮助读者深入理解其工作原理。通过这些函数,可以轻松地进行字符串长度计算、复制、连接、比较等操作。
|
17天前
|
SQL 关系型数据库 C语言
PostgreSQL SQL扩展 ---- C语言函数(三)
可以用C(或者与C兼容,比如C++)语言编写用户自定义函数(User-defined functions)。这些函数被编译到动态可加载目标文件(也称为共享库)中并被守护进程加载到服务中。“C语言函数”与“内部函数”的区别就在于动态加载这个特性,二者的实际编码约定本质上是相同的(因此,标准的内部函数库为用户自定义C语言函数提供了丰富的示例代码)
|
1月前
|
C语言
【C语言】字符串及其函数速览
【C语言】字符串及其函数速览
23 4
|
1月前
|
编译器 程序员 C语言
【C语言篇】从零带你全面了解函数(包括隐式声明等)(下篇)
⼀般情况下,企业中我们写代码时候,代码可能⽐较多,不会将所有的代码都放在⼀个⽂件中;我们往往会根据程序的功能,将代码拆分放在多个⽂件中。
|
1月前
|
测试技术 C语言
C语言中的void函数
C语言中的void函数