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

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

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

有人知道我在说什么吗?

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

评论

关于a2ensite的断言在CentOS中不正确

#1 楼

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

/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

评论


是的,我知道如何使用命令行,谢谢

–加森·特尔莫迪(Ghassen Telmoudi)
2012年9月5日上午9:02

然后我不确定您的真正要求。

– pkhamre
2012年9月5日在9:04

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

–里卡多·马丁斯(Ricardo Martins)
13年1月23日在11:34

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

– Mads Skjern
2014年8月20日在19:59

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

– pkhamre
16年12月16日在9:08

#2 楼

只需创建此脚本/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 }' <<< $(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=""

##
# 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 "" 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=()
    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 "" 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: "
    [[ "" ]] && 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 "" 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”

禁用站点“ test_website”

$ sudo nginx_modsite -e test_website


评论


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

– radtek
2014年11月4日19:16

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

– Tobltobs
16年6月2日在14:30



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

–马特·博尔哈(Matt Borja)
16年7月10日在13:39

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

–烤饼
17年8月30日在21:40

请注意,您对代码进行了双重许可:页面页脚表示用户提供的内容是具有共同需要的创作共用,并且您的代码也拥有自己的许可。我很确定,这意味着您可以在任一条款下使用它。坦白地说,我认为在您的stackexchange代码段中包含许可证相当过分……

–吕克
19年2月2日,11:49

#3 楼

您是指nginx_ensitenginx_dissite吗?

评论


这几乎不是答案,是吗?在使用apt-get安装的Ubuntu上,我的nginx安装中没有这些命令。似乎这只是一个第三方脚本:github.com/perusio/nginx_ensite

– Mads Skjern
2014年8月20日19:53



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

– Mads Skjern
15年3月23日在9:32

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

– Mads Skjern
2015年3月23日在9:32



@MadsSkjern好吧,您只需单击链接即可。 :)

–迈克尔·汉普顿
2015年3月23日在15:17



#4 楼

NGINX

如果您使用的是http://nginx.org/packages/中nginx的官方上游软件包之一,最好的方法是导航到/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上禁用/启用站点:


要禁用站点:如果config位于conf.d中,只需将文件重命名为不再具有.conf后缀即可;
如果要启用站点,最好的方法是将其移动到sites-enabled,并重命名为sites-enabled后缀。

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

评论


我想指出的是,此答​​案的问题在于有关Debian和派生工具的两个错误假设:1)conf.d目录的目的是在服务器范围内进行配置,例如用于模块,插件,fastcgi处理程序等,而显然不是将主机/虚拟主机配置存储在和中)2)不应在启用了站点的serverfault.com/a/825297/86189中编辑任何文件

– Bojan Markovic
17-09-5在11:14



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

–cnst
17年9月5日在17:54

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

– Bojan Markovic
17年9月7日在8:12



..我给你(在这方面缺少文档)。但是,您是第一个在Debian上运行Web服务器的人,对此我感到困惑。仅在Apache或Nginx中启用了ls -al sites即可显示目录中的现有文件是-available,Apache下模块的同上符号链接以及提供的a2enmod / a2dismod脚本。

– Bojan Markovic
17年9月7日在8:15



@pzrq,您等于是许多无关的事物;可用/启用与apache或debian无关;与此相反,没有证据表明,这基本上是一些维护人员在适当的时间,没有人看的时候潜入正确的地方,并且卡住了。如果您已经在花费资源来过渡到Nginx,则没有理由继续使用它,例如,这将已经需要重写配置以摆脱.htaccess的要求-最好在考虑所有云和发行版的情况下对您的配置进行标准化,使用conf.d原样就很容易。

–cnst
18年2月6日在21:25

#5 楼

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

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

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

评论


@Pyrite在Ubuntu 14.04上,扩展不起作用,因为nginx.conf包含启用的站点,如include / etc / nginx / sites-enabled / *;它仅将conf目录包含为* .conf

– Bojan Markovic
15年7月5日在17:45

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

–烤饼
16年11月4日,11:45



@cnst我什至不认为这是邪恶的,尤其是他们选择的站点(包括可用站点和启用站点),因为它们确实有其优点和用途。有人可能应该将有关nginx conf中真正违规行的错误报告提交到/etc/nginx/sites-enabled/*.conf;他们可能会因为疏忽而这样做。但是,如果您尊重Debian工作流程,那么您将无论如何都在可用站点中编辑文件,并将要启用的文件符号链接到启用站点的文件中。

– Bojan Markovic
17年4月4日在9:44

@cnst为什么不言而喻?它使您能够启用和禁用虚拟主机而不删除它们,这在apache和nginx上都是相同的。您对nginx完全感兴趣的事实并不会使Debian维护者为两个Web服务器提供类似的启用/禁用方法的意图无效。

– Bojan Markovic
17年9月5日,11:10

@cnst您所指出的问题绝对与此无关。如果他们将虚拟主机配置保留在conf.d中,也会发生同样的事情。

– Bojan Markovic
17年7月7日在8:07

#6 楼

快速而肮脏的Shell脚本
在设置新的Debian服务器时阅读了这里的答复,然后开始做一些研究之后,我制作了一些Shell脚本来帮助我启用/禁用服务器上的站点。至少具有一些安全性(禁用了root权限,非默认端口等)。拥有root访问权限的任何人都可以在默认情况下在Debian PATH中调用/usr/local/bin/,因此可以从任何地方调用这些脚本。
通过在sites_enabled中创建和删除别名,可以完成这些工作(我使用多年的方式),因此请不要触摸内容sites_available中的虚拟主机文件数量。
在以下位置启用站点
/usr/local/bin/ngensite.sh
#!/bin/sh
read -p "Website to enable: " site;
ln -s /etc/nginx/sites-available/"$site" /etc/nginx/sites-enabled/
echo "$site enabled. Now run 'service nginx reload'"

然后从命令行:sudo ngensite.sh
(提示将需要确切的nginx virtualhosts配置文件)。
禁用站点
/usr/local/bin/ngdissite.sh
#!/bin/sh
read -p "Website to disable: " site;
rm /etc/nginx/sites-enabled/"$site"
echo "$site disabled. Now run 'service nginx reload'"

然后从命令行:sudo ngdissite.sh
(提示将需要确切的nginx virtualhosts配置文件)。

如果您发现其中的任何问题(虽然还不完善,但它们对我有帮助),请突出显示它们。

#7 楼

我知道这在技术上不正确,但我只是将mvsites-available中的配置sites-enabled。它工作正常,不要过复杂的生活。