Nginx启用站点命令


131

我们都知道如何在Linux上使用apache启用网站。我很确定我们都同意使用a2ensite命令。

不幸的是,Nginx没有默认的等效命令,但是确实发生了,我在ubuntu上安装了一些软件包,使我可以启用/禁用站点并列出它们。

问题是我不记得这个软件包的名称。

有人知道我在说什么吗?

请告诉我这个软件包的名称和命令名称。


5
关于a2ensite的断言不适用于CentOS
user619714'9

Answers:


166

如果您nginx已从Ubuntu存储库安装了该软件包,则将有两个目录。

/etc/nginx/sites-enabled/etc/nginx/sites-available

在主要的nginx配置中/etc/nginx/nginx.conf,您具有以下行:

include /etc/nginx/sites-enabled/*.conf;

因此,基本上要列出所有可用的虚拟主机,您可以运行以下命令:

ls /etc/nginx/sites-available

要激活其中之一,请运行以下命令:

ln -s /etc/nginx/sites-available/www.example.org.conf /etc/nginx/sites-enabled/

Apache随附的脚本基本上只是简单的外壳包装程序,其功能与上述类似。

链接文件后,请记住运行sudo service nginx reload/service nginx reload


5
是的,我知道如何使用命令行,谢谢
Ghassen Telmoudi 2012年

23
然后我不确定您的真正要求。
pkhamre 2012年

3
记得用以下命令重新加载nginx服务器:sudo服务nginx重新加载
Ricardo Martins

16
@pkhamre:使用Apache时,有两个脚本:a2ensite和a2dissite。它们只是创建和删除您描述的符号链接,因此它们是启用和禁用的更快方法。
Mads Skjern 2014年

6
感谢您一直以来对这个旧答案的支持。如果OP会接受这个答案,那将是史诗般的:)
pkhamre

69

只需创建此脚本/usr/bin/nginx_modsite并使其可执行即可。

#!/bin/bash

##
#  File:
#    nginx_modsite
#  Description:
#    Provides a basic script to automate enabling and disabling websites found
#    in the default configuration directories:
#      /etc/nginx/sites-available and /etc/nginx/sites-enabled
#    For easy access to this script, copy it into the directory:
#      /usr/local/sbin
#    Run this script without any arguments or with -h or --help to see a basic
#    help dialog displaying all options.
##

# Copyright (C) 2010 Michael Lustfield <mtecknology@ubuntu.com>

# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.

##
# Default Settings
##

NGINX_CONF_FILE="$(awk -F= -v RS=' ' '/conf-path/ {print $2}' <<< $(nginx -V 2>&1))"
NGINX_CONF_DIR="${NGINX_CONF_FILE%/*}"
NGINX_SITES_AVAILABLE="$NGINX_CONF_DIR/sites-available"
NGINX_SITES_ENABLED="$NGINX_CONF_DIR/sites-enabled"
SELECTED_SITE="$2"

##
# Script Functions
##

ngx_enable_site() {
    [[ ! "$SELECTED_SITE" ]] &&
        ngx_select_site "not_enabled"

    [[ ! -e "$NGINX_SITES_AVAILABLE/$SELECTED_SITE" ]] && 
        ngx_error "Site does not appear to exist."
    [[ -e "$NGINX_SITES_ENABLED/$SELECTED_SITE" ]] &&
        ngx_error "Site appears to already be enabled"

    ln -sf "$NGINX_SITES_AVAILABLE/$SELECTED_SITE" -T "$NGINX_SITES_ENABLED/$SELECTED_SITE"
    ngx_reload
}

ngx_disable_site() {
    [[ ! "$SELECTED_SITE" ]] &&
        ngx_select_site "is_enabled"

    [[ ! -e "$NGINX_SITES_AVAILABLE/$SELECTED_SITE" ]] &&
        ngx_error "Site does not appear to be \'available\'. - Not Removing"
    [[ ! -e "$NGINX_SITES_ENABLED/$SELECTED_SITE" ]] &&
        ngx_error "Site does not appear to be enabled."

    rm -f "$NGINX_SITES_ENABLED/$SELECTED_SITE"
    ngx_reload
}

ngx_list_site() {
    echo "Available sites:"
    ngx_sites "available"
    echo "Enabled Sites"
    ngx_sites "enabled"
}

##
# Helper Functions
##

ngx_select_site() {
    sites_avail=($NGINX_SITES_AVAILABLE/*)
    sa="${sites_avail[@]##*/}"
    sites_en=($NGINX_SITES_ENABLED/*)
    se="${sites_en[@]##*/}"

    case "$1" in
        not_enabled) sites=$(comm -13 <(printf "%s\n" $se) <(printf "%s\n" $sa));;
        is_enabled) sites=$(comm -12 <(printf "%s\n" $se) <(printf "%s\n" $sa));;
    esac

    ngx_prompt "$sites"
}

ngx_prompt() {
    sites=($1)
    i=0

    echo "SELECT A WEBSITE:"
    for site in ${sites[@]}; do
        echo -e "$i:\t${sites[$i]}"
        ((i++))
    done

    read -p "Enter number for website: " i
    SELECTED_SITE="${sites[$i]}"
}

ngx_sites() {
    case "$1" in
        available) dir="$NGINX_SITES_AVAILABLE";;
        enabled) dir="$NGINX_SITES_ENABLED";;
    esac

    for file in $dir/*; do
        echo -e "\t${file#*$dir/}"
    done
}

ngx_reload() {
    read -p "Would you like to reload the Nginx configuration now? (Y/n) " reload
    [[ "$reload" != "n" && "$reload" != "N" ]] && invoke-rc.d nginx reload
}

ngx_error() {
    echo -e "${0##*/}: ERROR: $1"
    [[ "$2" ]] && ngx_help
    exit 1
}

ngx_help() {
    echo "Usage: ${0##*/} [options]"
    echo "Options:"
    echo -e "\t<-e|--enable> <site>\tEnable site"
    echo -e "\t<-d|--disable> <site>\tDisable site"
    echo -e "\t<-l|--list>\t\tList sites"
    echo -e "\t<-h|--help>\t\tDisplay help"
    echo -e "\n\tIf <site> is left out a selection of options will be presented."
    echo -e "\tIt is assumed you are using the default sites-enabled and"
    echo -e "\tsites-disabled located at $NGINX_CONF_DIR."
}

##
# Core Piece
##

case "$1" in
    -e|--enable)    ngx_enable_site;;
    -d|--disable)   ngx_disable_site;;
    -l|--list)  ngx_list_site;;
    -h|--help)  ngx_help;;
    *)      ngx_error "No Options Selected" 1; ngx_help;;
esac

这个怎么运作:

列出所有站点

$ sudo nginx_modsite -l

启用网站“ test_website”

$ sudo nginx_modsite -e test_website

禁用网站“ test_website”

$ sudo nginx_modsite -d test_website

在ngx_relaod函数中,我注释掉了读取内容,只做了reload =“ y”,因为我是通过cron运行此命令的,根本不希望出现提示。谢谢!
radtek

是的,这很合理,您能告诉我您在哪里进行更改吗?
Ghassen Telmoudi 2014年

10
一个相当大的脚本,用于包装一些标准的单行命令。
tobltobs

1
@tobltobs好的程序员编写代码,伟大的程序员偷代码:)这为我的服务器映像脚本集合锦上添花。
rdev5

5
@GhassenTelmoudi,因为您一直提到的脚本是第三方脚本,甚至没有被创建者(ubuntu)打包到nginx包中,您的意见建议在(一行)命令行替代方案中使用第三方脚本。这就是创建安全漏洞和不必要的复杂依赖关系树的方式
烤饼

32

您是指nginx_ensitenginx_dissite吗?


16
这仅仅是一个答案,不是吗?这些命令在我的nginx安装中以及在使用apt-get安装的Ubuntu上不存在。看来这只是第3方的脚本:github.com/perusio/nginx_ensite
Mads Skjern

5
@MadsSkjern如果这是“几乎没有答案”,那么所接受的答案也不是很大!
迈克尔·汉普顿

3
首先,感谢您的回答:)抱歉,我的评论听起来有些令人反感,当时我实际上只是想指出一下(当时)它对我不是很有用,因为它假定读者。
Mads Skjern 2015年

25
您用两个命令和一个URL甚至以问题的形式回答了。作为经验不足的人,您的回答将使我陷入谷歌搜索。也许我会在2分钟内找到一个有用的指南/教程/演示,也许我会环顾一个小时,但仍然感到困惑。当时对我有帮助的是:“有这些工具nginx_ensite和nginx_dissite,这是第3方脚本,请从此处下载它,然后以这种方式工作,例如示例。” Ghassen的答案更详尽,更入门,更有用。我希望您能理解我的意思:)
Mads Skjern 2015年

8
@MadsSkjern好吧,您只需单击链接即可。:)
迈克尔·汉普顿

4

NGINX

如果您使用nginx的官方上游包之一http://nginx.org/packages/,最好的办法就是导航到/etc/nginx/conf.d从具有目录,并将其重命名受影响的文件.conf后缀为具有不同之一禁用站点:

sudo mv -i /etc/nginx/conf.d/default.conf{,.off}

或相反启用它:

sudo mv -i /etc/nginx/conf.d/example.com.conf{.disabled,}

这是因为默认值/etc/nginx/nginx.conf具有以下include指令:

http {
    …
    include /etc/nginx/conf.d/*.conf;
}

Debian / Ubuntu

但是,如果您使用的是Debian / Ubuntu衍生产品,则除了之外conf.d,您还可能拥有邪恶的非标准sites-availablesites-enabled目录和目录,其中一些文件可能会草率地包含在其中,而不考虑其扩展名:

http {
    …
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

因此,在Debian / Ubuntu中,您可能首先必须弄清楚站点配置的位置。

  • 通过运行查找与给定掩码匹配的所有常规文件,可以使用以下命令来获取所有可用站点的列表find(1)

    find /etc/nginx -maxdepth 2 -type f \( -path "*/conf.d/*.conf" -or -path "*/sites-*/*" \)

  • 您可以使用以下命令来获取所有已启用站点的列表:

    find /etc/nginx -maxdepth 2 \( -path "*/conf.d/*.conf" -or -path "*/sites-enabled/*" \)

然后在Debian / Ubuntu上禁用/启用站点:

  • 禁用站点:如果配置为conf.d,只是文件重命名为不再有.conf后缀; 或者,如果sites-enabled将其移出sites-enabled

  • 启用网站,最好的方法是将其移至/etc/nginx/conf.d,然后重命名为带有.conf后缀。

PS:为什么我认为Debian include /etc/nginx/sites-enabled/*;是邪恶的?尝试在该目录中编辑几个文件,然后emacs创建备份文件(带~后缀),然后再次询问我。


4
我想指出的是,此答​​案的问题在于有关Debian和派生工具的两个错误假设:1)conf.d目录的目的是在服务器范围内进行配置,例如用于模块,插件,fastcgi处理程序等,并且明确地存储主机和中的/ vhost配置2)一个人不应编辑sites-enabled serverfault.com/a/825297/86189中的
Bojan Markovic

@BojanMarkovic,你错了。您不能在中提供服务器范围的配置conf.d,因为它包含在与sites-enabled一个http级别的上下文相同的上下文中,因此,模块和插件指令可能不适用。同样,您认为不应编辑文件的假设sites-enabled只是一厢情愿–发行版或目录中没有这样的指令,因此,这纯粹是您的假设,而发行版绝对不会执行此假设,因此,您由此引起的各种问题,例如stackoverflow.com/q/45852224/1122270
cnst

您所指出的问题绝对与此无关。我conf.d可能是Nginx的Debian维护者(或者为了与上游的兼容性而保留),这是错误的。关于不编辑中的文件sites-enabled,这不是一厢情愿的想法,而是他们试图在Nginx上模仿的Apache下的假想流程。在Apache中,由于a2ensitea2dissite脚本的存在,这一点很明显。不幸的是,Nginx没有提供任何种类的信息,这表明该软件包在Debian上的维护质量有多低。两者都缺少文档,是真的。
Bojan Markovic'9

2
..我给你(在这方面缺少文档)。但是,您是第一个在Debian上运行Web服务器的人,对此我感到困惑。ls -al sites-enabledApache或Nginx中的一个简单示例显示目录中的现有文件是Apache中的-available模块的,从ditto到从符号链接以及提供的a2enmod/ a2dismodscirpts。
Bojan Markovic'9

1
@pzrq,您等于是许多无关的事物;可用/启用与apache或debian无关;与此相反,没有证据表明,这基本上是一些维护人员在正确的时间,没有人看的时候潜入正确的地方而卡住的东西。如果您已经在花费资源来过渡到nginx,则没有理由继续使用它,例如,这将已经需要进行配置重写才能摆脱.htaccess的影响-最好在考虑所有云和发行版的情况下对您的配置进行标准化,按现状即可轻松完成conf.d
cnst

1

另一种方法是将站点的配置文件重命名为不带.conf的文件

例如 sudo mv mysite.conf mysite.conf.disabled

然后重新加载nginx,该虚拟主机将恢复为默认值。


使用nginx_modsite命令总是很不错的,比起每次重命名文件@Pyrite
Ghassen Telmoudi,2015年

3
@Pyrite在Ubuntu 14.04上,扩展名不正确,因为nginx.conf包含启用站点的站点,因为include /etc/nginx/sites-enabled/*;它仅包含conf目录,如*.conf
Bojan Markovic

2
@GhassenTelmoudi,因为您一直提到的脚本是第三方脚本,甚至没有被创建者(ubuntu)打包到nginx包中,您的意见建议在(一行)命令行替代方案中使用第三方脚本。这就是创建安全漏洞和不必要的复杂依赖关系树的方式。
烤饼

1
@cnst我不会走得太远,因为称之为邪恶,尤其是他们的选择sites-available,并sites-enabled为他们做有可取之处和使用。有人可能只应该为nginx conf中的真正违规行提交错误报告/etc/nginx/sites-enabled/*.conf;,他们可能会因为疏忽而将其提交。但是,如果您尊重Debian工作流程,则sites-available无论如何都将编辑文件,并将要启用的文件符号链接到中sites-enabled
Bojan Markovic

1
@cnst 为什么不言而喻?它使您能够启用和禁用虚拟主机而不删除它们,这在apache和nginx上都是相同的对nginx完全感兴趣的事实并不会使Debian维护者为两个Web服务器提供类似的启用/禁用方法的意图无效。
Bojan Markovic
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.