Користувальницькькі налаштування

Налаштування сайту


thttpd

Це стара версія документу!


thttpd

Установка

Настройка

Создание DEB-пакета

thttpd, поставляемый разработчиками, не собирается сразу. Выдаёт ошибку:

htpasswd.c:52: error: conflicting types for 'getline'

Проблема заключается в том, что в файле htpasswd.c вводится функция getline, а это имя уже объявлено ранее в <stdio.h>. Таким образом возникает конфликт. Решить его можно1) заменой имени getline в файле htpasswd.c на любое другое; например, на my_getline. Главное - сделать это во всём файле, чтобы не пытаться вызвать не ту функцию, которая определена.

При простой сборке из исходников по процедуре configure && make && make install можно просто вручную отредактировать этот файл. Для сборки же пакета под Дебиан гораздо лучше создать заплату2).

wget -c 'http://www.acme.com/software/thttpd/thttpd-2.25b.tar.gz'
cp thttpd-2.25b.tar.gz thttpd_2.25b.orig.tar.gz
tar -xvf thttpd-2.25b.tar.gz
cp -r thttpd-2.25b thttpd-2.25b.orig

Внесём некоторые исправления, необходимые для сборки под Дебиан, и создадим заплаты.
Отредактировать нужно файлы Makefile.in, extras/Makefile.in и extras/htpasswd.c так, как видно в созданных мной заплатах ниже. Сами же эти заплаты генерируются следующим образом3):

diff -Nuar thttpd-2.25b.orig/extras/htpasswd.c thttpd-2.25b/extras/htpasswd.c > 01-htpasswd.c-getline.diff
diff -Nuar thttpd-2.25b.orig/Makefile.in thttpd-2.25b/Makefile.in > 02-Makefiles.diff
diff -Nuar thttpd-2.25b.orig/extras/Makefile.in thttpd-2.25b/extras/Makefile.in >> 02-Makefiles.diff

В результате чего получаем 2 файла:

01-htpasswd.c-getline.diff
--- thttpd-2.25b.orig/extras/htpasswd.c	2001-12-19 02:08:08.000000000 +0200
+++ thttpd-2.25b/extras/htpasswd.c	2014-07-19 02:26:58.129794578 +0300
@@ -49,7 +49,7 @@
     while((line[y++] = line[x++]));
 }
 
-static int getline(char *s, int n, FILE *f) {
+static int my_getline(char *s, int n, FILE *f) {
     register int i=0;
 
     while(1) {
@@ -189,7 +189,7 @@
     strcpy(user,argv[2]);
 
     found = 0;
-    while(!(getline(line,MAX_STRING_LEN,f))) {
+    while(!(my_getline(line,MAX_STRING_LEN,f))) {
         if(found || (line[0] == '#') || (!line[0])) {
             putline(tfp,line);
             continue;
02-Makefiles.diff
--- thttpd-2.25b.orig/Makefile.in	2005-06-29 20:52:54.000000000 +0300
+++ thttpd-2.25b/Makefile.in	2014-07-19 02:23:34.709786163 +0300
@@ -34,12 +34,12 @@
 # Pathname of directory to install the man page.
 MANDIR = @mandir@
 # Pathname of directory to install the CGI programs.
-WEBDIR = $(prefix)/www
+WEBDIR = $(prefix)/lib/thttpd
 
 # CONFIGURE: The group that the web directory belongs to.  This is so that
 # the makeweb program can be installed set-group-id to that group, and make
 # subdirectories.  If you're not going to use makeweb, ignore this.
-WEBGROUP =	www
+WEBGROUP =	www-data
 
 # CONFIGURE: Directory for CGI executables.
 CGIBINDIR =	$(WEBDIR)/cgi-bin
@@ -121,9 +121,9 @@
 	    cd $$i ; \
 	    pwd ; \
 	    $(MAKE) $(MFLAGS) \
-		WEBDIR=$(WEBDIR) \
-		CGIBINDIR=$(CGIBINDIR) \
-		MANDIR=$(MANDIR) \
+		WEBDIR=$(DESTDIR)$(WEBDIR) \
+		CGIBINDIR=$(DESTDIR)$(CGIBINDIR) \
+		MANDIR=$(DESTDIR)$(MANDIR) \
 		WEBGROUP=$(WEBGROUP) \
 		install \
 	) ; done
--- thttpd-2.25b.orig/extras/Makefile.in	2005-06-29 20:53:20.000000000 +0300
+++ thttpd-2.25b/extras/Makefile.in	2014-07-19 02:25:58.965792130 +0300
@@ -66,12 +66,13 @@
 
 
 install:	all
-	rm -f $(BINDIR)/makeweb $(BINDIR)/htpasswd $(BINDIR)/syslogtocern
-	cp makeweb $(BINDIR)/makeweb
-	chgrp $(WEBGROUP) $(BINDIR)/makeweb
-	chmod 2755 $(BINDIR)/makeweb
-	cp htpasswd $(BINDIR)/htpasswd
-	cp syslogtocern $(BINDIR)/syslogtocern
+	rm -f $(DESTDIR)$(BINDIR)/makeweb $(DESTDIR)$(BINDIR)/htpasswd $(DESTDIR)$(BINDIR)/syslogtocern
+	cp makeweb $(DESTDIR)$(BINDIR)/makeweb
+	chgrp $(WEBGROUP) $(DESTDIR)$(BINDIR)/makeweb
+	chmod 2755 $(DESTDIR)$(BINDIR)/makeweb
+	cp htpasswd $(DESTDIR)$(BINDIR)/htpasswd
+	cp syslogtocern $(DESTDIR)$(BINDIR)/syslogtocern
+	-mkdir -p $(MANDIR)/man1
 	rm -f $(MANDIR)/man1/makeweb.1
 	cp makeweb.1 $(MANDIR)/man1/makeweb.1
 	rm -f $(MANDIR)/man1/htpasswd.1

После этого входим в каталог с исходниками и создаём все необходимые для сборки пакета конфигурационные файлы:

cd thttpd-2.25b
mkdir debian
mcedit debian/control
control
Source: thttpd
Maintainer: Wombat <wombat@wombat.org.ua>
Section: web
Priority: optional
Homepage: http://www.acme.com/software/thttpd/
Build-Depends: libc6-dev (>= 2.5-5)
 
Package: thttpd
Architecture: amd64
Depends: libc6 (>= 2.5-5)
Suggests: thttpd-util, logrotate
Conflicts: logcheck-database (<< 1.2.62)
Provides: httpd, httpd-cgi
Description: tiny/turbo/throttling HTTP server
 thttpd is a small, fast secure webserver. It features CGI support,
 URL-traffic-based throttling and basic authentication. thttpd has a very small
 memory footprint as it only forks itself in order to execute CGI scripts. It is
 designed to be as fast as fully featured web-servers and it performs extremely
 well under high load.
 .
 This package contains the thttpd server. For thttpd support programs see the
 thttpd-util package.
dch --create -v 2.25b-1 --package thttpd
changelog
thttpd (2.25b-1) UNRELEASED; urgency=low
 
  * Initial release. (Closes: #XXXXXX)
 
 -- Wombat <wombat@wombat.org.ua>  Fri, 18 Jul 2014 23:41:40 +0300
mcedit debian/rules
rules
#!/usr/bin/make -f
 
INSTALL = install
INSTALL_FILE = $(INSTALL) -p    -o root -g root  -m  644
INSTALL_DIR = $(INSTALL) -p -d -o root -g root  -m  755
INSTALL_SCRIPT = $(INSTALL) -p    -o root -g root  -m  755
 
%:
	dh $@
 
override_dh_auto_install:
 
	$(INSTALL_DIR) debian/tmp \
                       debian/tmp/etc \
                       debian/tmp/etc/thttpd \
                       debian/tmp/etc/logcheck/ignore.d.server \
                       debian/tmp/etc/logcheck/ignore.d.workstation \
                       debian/tmp/etc/init.d \
                       debian/tmp/etc/logrotate.d
 
	$(INSTALL_FILE) debian/throttle.conf debian/tmp/etc/thttpd/throttle.conf 
	$(INSTALL_FILE) debian/thttpd.conf debian/tmp/etc/thttpd/thttpd.conf 
	$(INSTALL_FILE) debian/ignore.d.server/thttpd debian/tmp/etc/logcheck/ignore.d.server/thttpd
	$(INSTALL_FILE) debian/ignore.d.workstation/thttpd debian/tmp/etc/logcheck/ignore.d.workstation/thttpd
	$(INSTALL_FILE) debian/logrotate.d/thttpd debian/tmp/etc/logrotate.d/thttpd
 
	$(INSTALL_SCRIPT) debian/init.d/thttpd debian/tmp/etc/init.d/thttpd
 
	dh_auto_install
mkdir debian/patch
cp -t debian/patch/ ../01-htpasswd.c-getline.diff ../02-Makefiles.diff

Стоит отметить, что все заплаты, находящиеся в папке debian/patches применяются сборщиком автоматически.

Поскольку для работы веб-сервера предпочтительнее, чтобы он запускался с правами специального пользователя, при установке пакета необходимо проконтролировать существование такого пользователя в системе. Для этого можно воспользоваться сценарием, выполняемым после установки:

debian/postinst
#!/bin/sh
 
set -e
 
# creating www group if it isn't already there
if ! getent group www-data >/dev/null; then
    addgroup --system www-data
fi
 
# creating thttpd user if he isn't already there
if ! getent passwd www-data >/dev/null; then
    adduser --system --ingroup www-data --no-create-home --home /var/www \
            --gecos "Web server" --shell /usr/sbin/nologin www-data
fi

На этом этапе пакет уже готов к сборке, но приведём ещё содержимое файлов, предназначенных для каталога /etc, так как они не входят в архив с исходниками программы, и взяты отсюда.

Можно скачать архив моей папки debian, содержащей все эти конфигурационные файлы и заплаты вместе: debian.tar.gz

debian/throttle.conf
# /etc/thttpd/throttle.conf: thttpd throttle file
 
# This file is for thttpd processes created by /etc/init.d/thttpd.
# Please note that by default, no throttling takes place.  That is, thttpd
# transfers files as fast as possible. The THROTTLING section of the thttpd(8)
# manpage details on the syntax of this file, and includes the following example
# (here commented out):
#
# <PATTERN>	[<MIN B/s>-]<MAX B/s>
# **		2000-100000		# limit total web usage to 2/3 of our
#					# T1, but never go below 2000 B/s
# **.jpg|**.gif	50000			# limit images to 1/3 of our T1
# **.mpg	20000			# and movies to even less
# jef/**	20000			# jef's pages are too popular
debian/thttpd.conf
# /etc/thttpd/thttpd.conf: thttpd configuration file
 
# This file is for thttpd processes created by /etc/init.d/thttpd.
# Commentary is based closely on the thttpd(8) 2.25b manpage, by Jef Poskanzer.
 
# Specifies an alternate port number to listen on.
port=80
 
# Specifies a directory to chdir() to at startup. This is merely a convenience -
# you could just as easily do a cd in the shell script that invokes the program.
dir=/var/www
 
# Do a chroot() at initialization time, restricting file access to the program's
# current directory. If chroot is the compiled-in default (not the case on
# Debian), then nochroot disables it. See thttpd(8) for details.
#nochroot
chroot
 
# Specifies a directory to chdir() to after chrooting. If you're not chrooting,
# you might as well do a single chdir() with the dir option. If you are
# chrooting, this lets you put the web files in a subdirectory of the chroot
# tree, instead of in the top level mixed in with the chroot files.
#data_dir=
 
# Don't do explicit symbolic link checking. Normally, thttpd explicitly expands
# any symbolic links in filenames, to check that the resulting path stays within# the original document tree. If you want to turn off this check and save some
# CPU time, you can use the nosymlinks option, however this is not
# recommended. Note, though, that if you are using the chroot option, the
# symlink checking is unnecessary and is turned off, so the safe way to save
# those CPU cycles is to use chroot.
#symlinks
#nosymlinks
 
# Do el-cheapo virtual hosting. If vhost is the compiled-in default (not the
# case on Debian), then novhost disables it. See thttpd(8) for details.
#vhost
#novhost
 
# Use a global passwd file. This means that every file in the entire document
# tree is protected by the single .htpasswd file at the top of the tree.
# Otherwise the semantics of the .htpasswd file are the same. If this option is
# set but there is no .htpasswd file in the top-level directory, then thttpd
# proceeds as if the option was not set - first looking for a local .htpasswd
# file, and if that doesn't exist either then serving the file without any
# password. If globalpasswd is the compiled-in default (not the case on Debian),
# then noglobalpasswd disables it.
#globalpasswd
#noglobalpasswd
 
# Specifies what user to switch to after initialization when started as root.
user=www-data
 
# Specifies a wildcard pattern for CGI programs, for instance "**.cgi" or
# "/cgi-bin/*". See thttpd(8) for details.
cgipat=/cgi-bin/*
 
# Specifies a file of throttle settings. See thttpd(8) for details.
throttles=/etc/thttpd/throttle.conf
 
# Specifies a hostname to bind to, for multihoming. The default is to bind to
# all hostnames supported on the local machine. See thttpd(8) for details.
#host=
 
# Specifies a file for logging. If no logfile option is specified, thttpd logs
# via syslog(). If logfile=/dev/null is specified, thttpd doesn't log at all.
logfile=/var/log/thttpd.log
 
# Specifies a file to write the process-id to. If no file is specified, no
# process-id is written. You can use this file to send signals to thttpd. See
# thttpd(8) for details.
#pidfile=
 
# Specifies the character set to use with text MIME types.
#charset=iso-8859-1
 
# Specifies a P3P server privacy header to be returned with all responses. See
# http://www.w3.org/P3P/ for details. Thttpd doesn't do anything at all with the
# string except put it in the P3P: response header.
#p3p=
 
# Specifies the number of seconds to be used in a "Cache-Control: max-age"
# header to be returned with all responses. An equivalent "Expires" header is
# also generated. The default is no Cache-Control or Expires headers, which is
# just fine for most sites.
#max_age=
debian/ignore.d.server/thttpd
# thttpd prints statistics every hour.
^\w{3} [ :0-9]{11} [._[:alnum:]-]+ thttpd\[[[:digit:]]+\]: up [[:digit:]]+ seconds, stats for 3600 seconds:$
^\w{3} [ :0-9]{11} [._[:alnum:]-]+ thttpd\[[[:digit:]]+\]:   thttpd - [[:digit:]]+ connections \([[:digit:].]+/sec\), [[:digit:]]+ max simultaneous, [[:digit:]]+ bytes \([[:digit:].]+/sec\), [[:digit:]]+ httpd_conns allocated$
^\w{3} [ :0-9]{11} [._[:alnum:]-]+ thttpd\[[[:digit:]]+\]:   libhttpd - [[:digit:]]+ strings allocated, [[:digit:]]+ bytes \([[:digit:].]+ bytes/str\)$
^\w{3} [ :0-9]{11} [._[:alnum:]-]+ thttpd\[[[:digit:]]+\]:   map cache - [[:digit:]]+ allocated, [[:digit:]]+ active \([[:digit:]]+ bytes\), [[:digit:]]+ free; hash size: [[:digit:]]+; expire age: [[:digit:]]+$
^\w{3} [ :0-9]{11} [._[:alnum:]-]+ thttpd\[[[:digit:]]+\]:   fdwatch - [[:digit:]]+ selects \([[:digit:].]+/sec\)$
^\w{3} [ :0-9]{11} [._[:alnum:]-]+ thttpd\[[[:digit:]]+\]:   timers - [[:digit:]]+ allocated, [[:digit:]]+ active, [[:digit:]]+ free$
debian/ignore.d.workstation/thttpd
# thttpd is listing a directory that has no index.html file.
^\w{3} [ :0-9]{11} [._[:alnum:]-]+ thttpd\[[[:digit:]]+\]: spawned indexing process [[:digit:]]+ for directory '.*'$
debian/logrotate.d/thttpd
/var/log/thttpd.log
{
	rotate 14
	daily
	compress
	missingok
	delaycompress
	postrotate
 
	if [ -x /usr/sbin/invoke-rc.d ]
	then
		invoke-rc.d thttpd force-reload > /dev/null 2>&1
	else
		/etc/init.d/thttpd force-reload > /dev/null 2>&1
	fi
 
	endscript
}
debian/init.d/thttpd
#!/bin/sh
 
### BEGIN INIT INFO
# Provides:          thttpd
# Required-Start:    $network
# Required-Stop:     $network
# Should-Start:
# Should-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Starts tiny/turbo/throttling HTTP server
# Description:       thttpd is a small, fast secure webserver.
### END INIT INFO
 
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/sbin/thttpd
DESC="web server"
NAME=thttpd
 
CONFFILE=/etc/thttpd/thttpd.conf
PIDFILE=/var/run/thttpd.pid
OPTIONS="-C $CONFFILE -i $PIDFILE"
 
test -x $DAEMON || exit 0
test -f $CONFFILE || exit 1
 
set -e
 
case "$1" in
	start)
		echo -n "Starting $DESC: "
		start-stop-daemon -S -q -p $PIDFILE -x $DAEMON -- $OPTIONS
		echo "$NAME."
		;;
 
	stop)
		echo -n "Stopping $DESC: "
 
		if ps ax | grep "$(cat $PIDFILE)" | grep -qv grep
		then
			start-stop-daemon -K -q -p $PIDFILE -x $DAEMON --signal 10
		fi
 
		echo "$NAME."
		;;
 
	force-stop)
		echo -n "Stopping $DESC: "
		start-stop-daemon -K -q -p $PIDFILE -x $DAEMON
		echo "$NAME."
		;;
 
	force-reload)
		if start-stop-daemon -K -q -p $PIDFILE -x $DAEMON --test
		then
			$0 restart
		fi
		;;
 
	restart)
		echo -n "Restarting $DESC: "
		start-stop-daemon -K -q -p $PIDFILE -x $DAEMON --signal 10
		sleep 1
		start-stop-daemon -S -q -p $PIDFILE -x $DAEMON -- $OPTIONS
		echo "$NAME."
		;;
 
	*)
		N=/etc/init.d/$NAME
		echo "Usage: $N {start|stop|force-stop|restart|force-reload}" >&2
		exit 1
		;;
esac
 
exit 0
2)
Patch
3)
Разумеется, ПОСЛЕ внесения нужных исправлений
thttpd.1405760897.txt.bz2 · В останнє змінено: 2014/07/19 12:08 by wombat