制作Debian风格的Tengine deb包

原创
2012/12/13 21:40
阅读数 4.6K

      前面尝试了一下tengine的动态加载模块的功能,觉得这样就有可能有大量部署的机会了,之前没用nginx是因为每次需要添加新的功能都需要重新编译一次,虽然nginx在性能上比apache好,但是如果有上百台机器部署了nginx就不好搞了,每个部门的web需求都不一样,所需要的模块也不一样,即使把所有自带模块都编译进去,但是还是会遇到一些很好的第三方模块的,现在tengine支持动态加载模块,就有希望了,一两台编译是可以接受的,大量部署tengine还是用包管理的比较好。

       下面开始制作以debian6系统为基础的tengine deb包,tengine包风格还是类似于debian一般web服务器软件包的风格。

        要把所有支持动态加载的模块都编译进去,需要以下包的支持:

apt-get install libxml2
apt-get install libxslt1.1
apt-get install libxslt1-dev
apt-get install libgd2-xpm libgd2-xpm-dev
apt-get install libgeoip1 libgeoip-dev
apt-get install libssl-dev
apt-get install libpcre3 libpcre3-dev
apt-get install libssl0.9.8

        首先,在/tmp目录下建一个制作deb包的环境目录tengine,先不必建立其他目录,最后的总体结构如下图:

└── tengine
    ├── DEBIAN            这个目录存放关于包的一些控制信息文件
    ├── etc
    │   ├── init.d        存放/etc/init.d/nginx文件
    │   ├── logrotate.d   存放nginx日志轮转配置文件
    │   └── nginx
    │       ├── conf      存放nginx的配置文件
    │       ├── modules   存放可以动态加载的模块
    │       └── sbin      存放dso_tool工具
    ├── usr
    │   └── sbin          存放nginx二进制文件
    └── var
        ├── lib
        │   └── nginx
        ├── log
        │   └── nginx     存放nginx日志
        └── www           存放web站点

        下载tengine源码包:tengine-1.4.2.tar.gz,进行编译安装,编译参数如下

./configure --prefix=/etc/nginx --sbin-path=/usr/sbin --error-log-path=/var/log/nginx/error.log --conf-path=/etc/nginx/conf/nginx.conf --pid-path=/var/run --with-http_addition_module=shared --with-http_xslt_module=shared --with-http_geoip_module=shared --with-http_image_filter_module=shared --with-http_sub_module=shared --with-http_flv_module=shared --with-http_slice_module=shared --with-http_mp4_module=shared --with-http_concat_module=shared --with-http_random_index_module=shared --with-http_map_module=shared --with-http_split_clients_module=shared --with-http_charset_filter_module=shared --with-http_access_module=shared --with-http_userid_filter_module=shared --with-http_footer_filter_module=shared --with-http_upstream_least_conn_module=shared --with-http_upstream_ip_hash_module=shared --with-http_user_agent_module=shared --with-http_memcached_module=shared --with-http_referer_module=shared --with-http_limit_conn_module=shared --with-http_limit_req_module=shared --with-http_scgi_module=shared --with-http_secure_link_module=shared --with-http_autoindex_module=shared --with-http_sysguard_module=shared --with-http_rewrite_module=shared --with-http_fastcgi_module=shared --with-http_empty_gif_module=shared --with-http_browser_module=shared --with-http_uwsgi_module=shared

        --prefix=/etc/nginx     这个目录存放除nginx二进制文件外的其余文件

        --sbin-path=/usr/sbin  这个目录有编译好的nginx二进制文件

        之前已经把所有依赖的包已经安装过了,所以不会出现问题,只要make&&make install即可,安装完成后在/etc/nginx中的目录结构如下:

nginx
├── conf
│   ├── browsers
│   └── 若干配置文件...
├── html
│   ├── 50x.html
│   └── index.html
├── logs
├── modules
│   ├── ngx_http_access_module.so
│   ├── ngx_http_addition_filter_module.so
│   ├── ngx_http_uwsgi_module.so
│   └── 若干模块...
└── sbin
    └── dso_tool

        开始进行乾坤大挪移...

mv /etc/nginx/conf /tmp/tengine/etc/nginx/
mv /etc/nginx/html/* /tmp/tengine/var/www/			  
mv /etc/nginx/modules /tmp/tengine/etc/nginx/
mv /etc/nginx/sbin /tmp/tengine/etc/nginx/
mv /usr/sbin/nginx /tmp/tengine/usr/sbin/
        开始补全在/tmp/tengine的其他目录。

        logrotate.d/nginx内容如下,nginx日志轮训用

/var/log/nginx/*.log {
	daily
	missingok
	rotate 52
	compress
	delaycompress
	notifempty
	create 640 root adm
	sharedscripts
	postrotate
		[ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
	endscript
}
        init.d/nginx内容如下,init启动nginx用

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/sbin/nginx
NAME=nginx
DESC=nginx
test -x $DAEMON || exit 0
if [ -f /etc/default/nginx ] ; then
	. /etc/default/nginx
fi
set -e
. /lib/lsb/init-functions
test_nginx_config() {
  if $DAEMON -t $DAEMON_OPTS >/dev/null 2>&1
  then
    return 0
  else
    $DAEMON -t $DAEMON_OPTS
    return $?
  fi
}
case "$1" in
  start)
	echo -n "Starting $DESC: "
        test_nginx_config
	start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid \
		--exec $DAEMON -- $DAEMON_OPTS || true
	echo "$NAME."
	;;
  stop)
	echo -n "Stopping $DESC: "
	start-stop-daemon --stop --quiet --pidfile /var/run/$NAME.pid \
		--exec $DAEMON || true
	echo "$NAME."
	;;
  restart|force-reload)
	echo -n "Restarting $DESC: "
	start-stop-daemon --stop --quiet --pidfile \
		/var/run/$NAME.pid --exec $DAEMON || true
	sleep 1
        test_nginx_config
	start-stop-daemon --start --quiet --pidfile \
		/var/run/$NAME.pid --exec $DAEMON -- $DAEMON_OPTS || true
	echo "$NAME."
	;;
  reload)
        echo -n "Reloading $DESC configuration: "
        test_nginx_config
        start-stop-daemon --stop --signal HUP --quiet --pidfile /var/run/$NAME.pid \
            --exec $DAEMON || true
        echo "$NAME."
        ;;
  configtest)
        echo -n "Testing $DESC configuration: "
        if test_nginx_config
        then
          echo "$NAME."
        else
          exit $?
        fi
        ;;
  status)
	status_of_proc -p /var/run/$NAME.pid "$DAEMON" nginx && exit 0 || exit $?
	;;
  *)
	echo "Usage: $NAME {start|stop|restart|reload|force-reload|status|configtest}" >&2
	exit 1
	;;
esac
exit 0
       nginx/conf/nginx.conf内容如下,因为web站点目录和log日志目录都有所改变,所以要小调一下

worker_processes  1;
error_log  /var/logs/nginx/error.log;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/logs/nginx/access.log  main;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   /var/www;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /var/www/50x.html;
        location = /50x.html {
            root   /var/www;
        }
    }
}

        剩下DEBIAN目录没有配置,结构如下:

DEBIAN/
├── control
├── postinst
├── postrm
├── preinst
└── prerm
        control:提供软件包的关联信息, 用于软件包管理器显示软件包的信息,用于安装前校验的依赖关系.是必需提供的文件

        postrm:在软件包从系统中卸载以后执行。dpkg告知这个脚本软件包是否已被卸载或清除。当因为冲突或升级,软件包被其它软件包卸载时也会执行这个脚本。

        preinst:在安装或升级软件包之前执行。

        prerm:脚本在软件包卸载之前执行。

        postinst:脚本在解包之后作为配置过程的一部分运行。例如:监听本机ip地址,更换端口之类的修改。在本文中我不需要做调整,所以没有设置该文件。

        DEBIAN/control内容如下,因为之前把依赖包都安装了,所以在控制文件中我去掉了依赖关系设置

Package: nginx
Version: 1.2.5
Architecture: amd64
Maintainer: Jose Parrella <bureado@debian.org>
Provides: httpd
Section: httpd
Priority: optional
Homepage: http://nginx.net
Description: xxxxxxxx
       DEBIAN/prerm文件内容如下

#!/bin/sh
set -e
case "$1" in
    remove|remove-in-favour|deconfigure|deconfigure-in-favour)
        if [ -x /etc/init.d/nginx ]; then
            if [ -x /usr/sbin/invoke-rc.d ] ; then
                   invoke-rc.d nginx stop
            else   
                   /etc/init.d/nginx stop
            fi
        fi
    ;;
    upgrade|failed-upgrade)
    ;;
    *)
        echo "prerm called with unknown argument \`$1'" >&2
        exit 1
    ;;
esac
exit 0
        DEBIAN/postrm文件内容如下

#!/bin/sh
set -e
case "$1" in
       
	purge)
		rm -rf /var/lib/nginx /var/log/nginx /etc/nginx
	;;
	remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear)
        ;;
    *)
        echo "postrm called with unknown argument \`$1'" >&2
        exit 1
esac
# Automatically added by dh_installinit
if [ "$1" = "purge" ] ; then
	update-rc.d nginx remove >/dev/null
fi
# End automatically added section
exit 0

        DEBIAN/preinst文件内容如下

#!/bin/sh
set -e
if [ ! -d /var/lib/nginx ] ; then
	mkdir -p /var/lib/nginx
fi

if [ ! -d /etc/nginx ] ; then
        mkdir -p /etc/nginx/conf
        mkdir -p /etc/nginx/modules
        mkdir -p /etc/nginx/sbin
fi

if [ ! -d /var/log/nginx ] ; then
        mkdir -p /var/log/nginx
        touch /var/log/nginx/error.log
fi

exit 0
        所有文件已经ok,剩下就是打包了

dpkg -b tengine/ tengine_1.4.2-1+squeeze_amd64.deb
        测试如下图:


        加载ngx_http_autoindex_module.so模块,在配置文件中加入如下配置

dso{
    load ngx_http_autoindex_module.so;
}
        重启nginx,加入前和加入后区别如下

  

        访问nginx默认界面


        卸载tengine软件包

apt-get --purge remove nginx



展开阅读全文
打赏
2
44 收藏
分享
加载中
不错,终于找到一个成功的deb打包例子了
2014/07/09 15:18
回复
举报
China_OS博主

引用来自“盘先海”的评论

可以这样子自己制作deb包,然后在服务器上安装使用吗?

可以,上面那些都是实验过得
2014/03/03 13:59
回复
举报
可以这样子自己制作deb包,然后在服务器上安装使用吗?
2014/03/03 11:52
回复
举报
不错的文章,已经用上Tengine,目前看起来效果还不赖。
2013/12/22 20:41
回复
举报
好文!终于碰到懂DSO价值的同学了,泪奔。。。不过提醒一下,目前的tengine-1.4版本因为是development分支,所以DSO的版本(动态模块依赖的内部API版本号)可能会在开发过程中升级,从而可能需要重新编译。当然,tengine可执行文件保持在一个版本则问题不大 :)
2012/12/14 11:03
回复
举报
更多评论
打赏
5 评论
44 收藏
2
分享
返回顶部
顶部