thttpd嵌入式web开发笔记

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

thttpd是一款小型,快速,非阻塞的HTTP服务开源应用实现, 没有许多特别的特征,但是对大多数web它所提供的功能已经足够,非常适合用来作为嵌入式的Web服务器,可以方便地进行修改定制开发。

基本介绍

官方网站:

  • thttpd:http://www.acme.com/software/thttpd/
  • cgic:https://boutell.com/cgic/

程序启动使用:

thttpd [-C configfile] [-p port] [-d dir] [-dd data_dir] [-r|-nor] [-s|-nos] [-v|-nov] [-g|-nog] [-u user] [-c cgipat] [-t throttles] [-h host] [-l logfile] [-i pidfile] [-T charset] [-P P3P] [-M maxage] [-V] [-D]

选项基本介绍:

  • -C 指定一个可读的配置文件,可以在其中设置选项。使用一个配置文件的优势是,文件能被改变而且 thttpd将根据新的配置重新启动。 配置文件的语法很简单, 一系列的被空格分开的选项或"选项=值",选项名字和他们对应的指令行标志将被一起列出。
  • -p 设定一个交互的端口数字来监听,默认值是80 ,这一标志在配置文件中的选项名字是 " port ",在config.h中选项是是 DEFAULT_PORT
  • -d 对 chdir()指定一个目录,用来启动进程。这只是为了提供一个便捷方式 - 你可以比较容易地在shell 脚本中写一个cd命令来唤醒进程 这一面标志在c配置文件中的选项名字是" dir",在config.h 选项是WEBDIR USE_USER_DIR 。
  • -r 在初始化值时执行 chroot()能够限制文件访问程序的当前目录。如果 - r 是在默认下编译的,那么-nor 可以使其失效。下面有详细的介绍。这一标志在配置文件中的选项名字是 " chroot" 和 " nochroot",在 config.h文件中 选项是 ALWAYS_CHROOT
  • -dd 用来指定一个目录执行chdir(),如果你还没有chrooting, 你可以在-d标志后加上单一的chdir(),如果已经chrooting则可以把网页文件放入子目录,而不比把它们和chroot tree混在一起。这一标志在配置文件中的选项名字是 " data_dir" 。
  • -nos 不要做显式的软链接检查。 通常情况下, thttpd 显式地在文件名中扩展了所有的软链接,以此来 检查驻留在初始文件树里的最终路径。 如果你想要避开这些检查而节省一些处理器时间,你就可以使用 那 -nos标志,尽管这并不被推荐。但是,注意,如果你正在使用 chroot 选项,那么对软链接的检查就是不必要的因而被停止了 , 因此节省那些处理器时钟周期的保险办法是使用 chroot 。 这一标志在配置文件中的选项名字是 " symlinkcheck" 和 " nosymlinkcheck" 。
  • -v 做小开销的虚拟动作,如果-v是在编译时缺省配置的,那么-nov可以使其失效,下面有详细介绍。这一标志的 config- file的选项名字是 " vhost" 和 " novhost", config.h 选项是 ALWAYS_VHOST 。
  • -g 使用全局密码文件。这意味着,在这个目录树下的每个文件都是被在树顶部的单独.htpasswd文件所保护的。不管怎样,.htpasswd文件的语义是相同的。如果该选项被设置了,但在目录顶层却没有.htpasswd文件的话,那么thttpd进程可能没有被事先设置成一个局部.htpasswd文件,而且,如果这个也不存在的话,那么就表示该文件是没有任何密码的。如果-g被缺省编译了,那么-nog可以使其失效。这个标志在配置文件中的选项名是"globalpasswd"和"noglobalpasswd",在config.h中 的可选项是ALWAYS_GLOBAL_PASSWD。
  • -u 指定当以root初始登陆后切换到哪一个使用者。默认值是 " nobody "。这一标志在配置文件中的选项名字是 " user",在config.h中是DEFAULT_USER 。
  • -c 为 CGI 指定一个通配符, 举例来说如 "*.cgi"或 "/cgi-bin/"。这一标志在配置文件中的选项名字是 " cgipat",在config.h 中是 CGI_PATTERN 。
  • -t 指定一个文件来结束设置。细节如下。这一标志在配置文件中的选项名字是 " throttles "
  • -h 为多用户环境指定一个绑定的主机名。缺省情况是,把所有的主机都绑定在本地机器上。下面是详细介绍。这一标志在配置文件中的选项名字是 " host ",在 config.h中是 SERVER_NAME 。
  • -l 指定一个日志文件。如果-l参数没有被指定,那么thttpd通过syslog()进行日志记录。如果"-l /dev/null"被指定了,那么thttpd就不会再进行日志记录了。这个标志的配置文件选项名是"logfile"。
  • -I 指定一个写进程号的文件。如果没有文件被指定,那么就没有进程号被写入了。你可以使用这个文件给thttpd发送信号。看下面的详细介绍;这一标志在配置文件中的选项名字是 " pidfile" 。
  • -T 指定一个使用MIME文本类型的字符集。缺省情况是iso-8859-1。这个标志在配置文件中的选项名是"charset",在config.h 中是DEFAULT_CHARSET。
  • -P 指定一个能够返回所有响应的P3P秘密服务头。
  • -M 指定秒钟数,在"Cache-Control: max-age"环境下被使用。对于所有的响应,头部被返回。一个与此等价的"终止"头部也随之生成。缺省情况是没有Cache控制 或者终止头部,这对大多数网站来说,是非常理想的。这个标志的配置文件选项名是"max_age"。
  • -V 表示现在的版本信息
  • -D 这个标志最初仅仅用来作为一个调试标志,但是,在这里仍然有提一下的价值。因为它所做的这些事情的其中一件是阻止thttpd在后台自我复制。取而代之的是它象一个正规程序一样地在前台运行。在一些shell脚本中,你希望如果被封装的thttpd存在的话,它就会重启,如果你想运行这样的thttpd,应用这个标志是很有必要的。

交叉编译

  • thttpd: 示例CC=arm-hisiv100nptl-linux-gcc ./configure --host=arm-hisiv100nptl-linux
  • cgic: 直接与具体的cgi程序一起进行链接和编译,参照库中的sample示例

配置文件选项见上面的说明,文件示例参考:thttpd.conf

dir=/root/www/
#chroot
user=root
cgipat=/cgi-bin/**  # 相对于web根目录
logfile=/dev/null # 不记录日志,或者指定具体的日志文件
pidfile=/var/run/thttpd.pid

优化定制

  1. 修改CGI程序的运行时长限制: 针对大文件上传功能

    • config.h中的宏(默认,单位s): ** #define CGI_TIMELIMIT 30**
    • 使用的地方: libhttpd.c中的cgi函数创建了一个超时kill的定时器,通过这个宏控制。
  2. CGIC库中的临时文件保存目录修改

    • 库中的默认路径为: #define cgicTempDir  "/tmp"
    • 在嵌入式中最好是把临时路径修改为内存目录
  3. 获取CGIC中的文件上传临时文件名,避免进行多份拷贝读写

    • 增加cgiFormFileTempName接口,参照cgiFormFileName接口实现,参考cgiFormFileOpen获取到临时文件名的成员。
    • 文件上传的时候,CGIC库是在执行具体的cgi程序之前临时保存上传的文件,然后可以在具体的cgi程序中调用cgiFormFileOpencgiFormFileReadcgiFormFileClose这些函数来读取和处理上传的文件,使用参考cgic.h和samples中的代码。(这个流程等同于执行文件cp动作)
    • 注意:cgic保存的临时文件不会自动删除,需要手动删除
    • 当我们有了cgiFormFileTempName接口后,在验证文件完整后,可以直接将文件move或者是rename为需要的文件就可以了,避免拷贝导致的空间占用,同时也相当于移除了临时文件。

web目录结构

  • 建议将:html文件,css文件,js文件,资源文件,cgi程序分别存放布置
  • 文件的权限问题:thttpd要求只有符合cgipat模式的cgi程序可以有执行权限,其它web根目录下的文件都不能有执行权限,否则访问被拒绝。比如html文件不能有执行权限。

转载于:https://my.oschina.net/shelllife/blog/1829298

你可能感兴趣的:(嵌入式,shell,python)