nginx_uwsgi编译安装(Ubuntu)

UPDATE: 2012-10-03

在新系统上安装

安装

编译安装(nginx 1.0.25)

NGINX="nginx-1.2.5" \
&& mkdir -p /data/packages && cd /data/packages \
&& rm -rf nginx-* \
&& wget http://www.nginx.org/download/${NGINX}.tar.gz \
&& tar zxf ${NGINX}.tar.gz \
&& cd ${NGINX} && sed -i.bak 's/^CFLAGS="$CFLAGS -g"/#&/' auto/cc/gcc \
&& ./configure --user=www-data --group=www-data \
--prefix=/usr/local/nginx \
--http-log-path=/var/log/nginx \
--http-client-body-temp-path=/var/lib/nginx/body \
--http-proxy-temp-path=/var/lib/nginx/proxy \
--http-fastcgi-temp-path=/var/lib/nginx/fastcgi \
--pid-path=/var/run/nginx.pid \
--http-log-path=/var/log/nginx/access.log \
--error-log-path=/var/log/nginx/error.log \
--with-http_stub_status_module \
--with-http_gzip_static_module \
&& make && make install

执行文件链接、启动脚本

ln -sfT /usr/local/nginx/sbin/nginx /usr/sbin/nginx
install -m 755 -o root -g root "/data/rsync/tools/scripts/init.d/nginx" /etc/init.d/

nginx启动脚本

#! /bin/sh

### BEGIN INIT INFO
# Provides:          nginx
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts the nginx web server
# Description:       starts nginx using start-stop-daemon
### END INIT INFO

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
#DAEMON=/usr/sbin/nginx
DAEMON=/usr/local/nginx/sbin/nginx
NAME=nginx
DESC=nginx

test -x $DAEMON || exit 0

# Include nginx defaults if available
if [ -f /etc/default/nginx ] ; then
    . /etc/default/nginx
fi

set -e

. /lib/lsb/init-functions

test_nginx_config() {
  if $DAEMON -t
  then
    return 0
  else
    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

放置初始配置

nginxconfdir="/usr/local/nginx/conf"
pkgsDir="/data/rsync/tools"
install -m 644 -o root -g root "$pkgsDir/conf/nginx/nginx.conf" "$nginxconfdir/nginx.conf"
install -m 755 -o root -g root -d "$nginxconfdir/sites-available"
install -m 755 -o root -g root -d "$nginxconfdir/sites-enabled"
install -m 755 -o root -g root -d "$nginxconfdir/inc"
install -m 644 -o root -g root "$pkgsDir/conf/nginx/unknowsite.conf" "$nginxconfdir/sites-available/unknowsite.conf"
cd "$nginxconfdir/sites-enabled"
ln -sf "../sites-available/unknowsite.conf" .
cd -

版本及进程检查

nginx -v && ps aux|grep nginx

设置自启动(仅Web服务器执行)

update-rc.d nginx defaults # 设置自启动
#update-rc.d -f nginx remove # 取消自启动

编译相关说明

nginx平滑版本升级说明

可以在不中断服务的情况下 - 新的请求也不会丢失,使用新的 nginx 可执行程序替换旧的(当升级新版本或添加/删除服务器模块时)。

参考:http://wiki.nginx.org/NginxChsCommandLine

进程信号说明

TERM,INT 快速关闭
QUIT 从容关闭
HUP 重载配置,用新的配置开始新的工作进程,从容关闭旧的工作进程
USR1 重新打开日志文件
USR2 平滑升级可执行程序。
WINCH 从容关闭工作进程
TERM,INT 快速关闭
QUIT 从容关闭
USR1 重新打开日志文件

详细步骤说明

  1. 使用新的可执行程序替换旧的(最好做好备份)--完成编译安装。
  2. 发送 USR2 (kill -USR2 pid)信号给主进程(主进程将重命名nginx.pid为nginx.pid.oldbin)。执行新的可执行程序,
    1. 依次启动新的主进程和新的工作进程。此时两个 nginx 实例会同时运行,一起处理输入的请求。
      kill -USR2 `cat /var/run/nginx.pid` && ps axu|grep nginx
      
  1. 发送 WINCH ( kill -WINCH oldpid)信号给旧的主进程,它的工作进程就将开始从容关闭。
    1. 当旧的工作进程处理完所有已连接请求后将全部退出,仅由新工作进程处理请求。
      kill -WINCH `cat /var/run/nginx.pid.oldbin` && ps axu|grep nginx
      
  1. 升级失败,恢复为旧版本
       a) 发送HUP信号给旧的主进程,它将启动它的工作进程。
       kill -HUP `cat /var/run/nginx.pid.oldbin`
       b) 发送QUIT信号给新的主进程,要求其从容关闭主进程。
       kill -QUIT `cat /var/run/nginx.pid`
       c) 发送TERM信号给新的主进程,使用其退出,若失败则发KILL信号。
       新的主进程退出后,旧的主进程会移除.oldbin前缀,恢复为它的.pid文件。
       kill -TERM `cat /var/run/nginx.pid`
    
  1. 升级成功,保留新服务器:
    • 发送QUIT信号给旧的主进程使其退出(kill -QUIT oldpid)。
      kill -QUIT `cat /var/run/nginx.pid.oldbin` && ps axu|grep nginx
      
  1. 简单执行步骤
    kill -USR2 `cat /var/run/nginx.pid` && ps axu|grep nginx
    kill -WINCH `cat /var/run/nginx.pid.oldbin` && ps axu|grep nginx
    kill -QUIT `cat /var/run/nginx.pid.oldbin` && ps axu|grep nginx