题 Nginx启用站点命令


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

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

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

谁知道我在说什么?

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


104
2017-09-05 08:33




对于CentOS而言,关于a2ensite的断言是不正确的 - Iain


答案:


如果你已经安装了 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附带的脚本基本上只是简单的shell包装器,它们执行类似于上面的操作。

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


128
2017-09-05 08:49



是的,我知道如何使用命令行,谢谢 - Ghassen Telmoudi
然后我不确定你真正要求的是什么。 - pkhamre
记得用以下方法重新加载nginx服务器:sudo service nginx reload - Ricardo Martins
@pkhamre:使用Apache时有两个脚本:a2ensite和a2dissite。它们只是创建和删除您描述的符号链接,因此它们是更快的启用和禁用方法。 - Mads Skjern
感谢您对这个旧答案的持续赞成。如果OP会接受这个答案,那将是史诗般的:) - pkhamre


只需创建此脚本 /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

58
2017-12-18 14:58



在ngx_relaod函数中,我注释掉了read并且只是make reload =“y”因为我通过cron运行它并且根本不想要提示。谢谢! - radtek
是的,它是完美的意义,你能告诉我你在哪里做出改变? - Ghassen Telmoudi
一个非常大的脚本来包装一些标准的一行命令。 - tobltobs
@tobltobs优秀的程序员编写代码,优秀的程序员窃取代码:)这对我的服务器映像脚本集合提供了很好的补充。 - rdev5
@GhassenTelmoudi作为你一直提到的脚本是第三方脚本,它甚至没有被创建者(ubuntu)打包到nginx包中,你的注释建议在(一行)命令行替代上使用第三方脚本。这就是如何创建安全漏洞和不必要的复杂依赖树 - scones


你指的是 nginx_ensite 和 nginx_dissite


29
2017-09-05 08:36



这几乎不是答案,是吗?在我安装的nginx上,在使用apt-get安装的Ubuntu上没有这些命令。看起来它只是一个第三方脚本: github.com/perusio/nginx_ensite - Mads Skjern
@MadsSkjern如果这只是“几乎没有答案”那么接受的答案也不是很多! - Michael Hampton♦
首先,感谢您的回答:)对于我的评论感到抱歉,这可能听起来令人反感,当我实际上只想指出它对我(当时)不是很有用时,因为它假设太多了读者。 - Mads Skjern
你回答了两个命令和一个网址,甚至以问题的形式回答。作为一个经验水平低的人,你的回答会让我在那里谷歌搜索。也许我会在2分钟内找到一个有用的指南/教程/演示,也许我会四处寻找并仍然感到困惑。那时帮助我的是:“有这些工具nginx_ensite和nginx_dissite,它是第三方脚本,从这里下载,他们以这种方式工作,例如,示例”。 Ghassen的答案更精细,更具介意性,更有帮助。我希望你明白我的意思:) - Mads Skjern
@MadsSkjern嗯,你可以点击链接。 :) - Michael Hampton♦


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-available 和 sites-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 后缀。

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


3
2017-08-26 20:45



我想指出这个答案的问题在于关于Debian和衍生品的两个错误假设:1)目的 conf.d directory是服务器范围的配置,类似于模块,插件,fastcgi处理程序等,并且是显式的 不 存储主机/虚拟机配置和2)一 不应该 编辑中的任何文件 sites-enabled  serverfault.com/a/825297/86189 - Bojan Markovic
@BojanMarkovic,你错了。您无法在服务器范围内配置服务 conf.d,因为它包含在与...相同的上下文中 sites-enabled 一个 - http-level context,因此,模块和插件指令可能不适用。同样,你假设一个人不应该编辑文件 sites-enabled 只是一厢情愿的想法 - 在发行版或目录中没有这样的指示,所以,这纯粹是你的假设,这绝不是由发行版强制执行的,因此,你有各种各样的问题,例如: , stackoverflow.com/q/45852224/1122270。 - cnst
您指出的问题绝对与此无关。我错了 conf.d 可能是,Nginx的Debian维护者(或者它可能与上游保持兼容)。关于不编辑文件 sites-enabled,这不是一厢情愿的想法,而是他们试图在Nginx上仿效的Apache下的假设蠕虫。在apache中,由于存在而非常明显 a2ensite 和 a2dissite 脚本。不幸的是,Nginx没有提供任何类型,它显示了该软件包在Debian上的维护质量有多低。两者都缺乏文档,是的。 - Bojan Markovic
..我会给你的(文件在这方面非常缺乏)。然而,你是第一个在Debian上运行Web服务器的人,我已经与之交谈了,这让人感到困惑。只是一个简单的 ls -al sites-enabled 在Apache或Nginx中,显示目录中的现有文件都是符号链接 -available,同样适用于Apache下的模块,以及提供的 a2enmod/a2dismod scirpts。 - Bojan Markovic
@pzrq,你把很多无关的东西等同起来; available / enabled与apache和debian无关;相反的证据不足,它基本上只是某些维护者在正确的时间潜入正确的地方,当没有人看的时候,它就会卡住;没有理由继续使用它,如果你已经花费资源转换到nginx,这已经需要配置重写来摆脱.htaccess,例如 - 可能同样标准化你的配置所有的云和发行版,这很容易 conf.d 原样。 - cnst


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

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

然后重新加载nginx,该vhost将回退到默认值。


0
2018-05-19 03:15



使用nginx_modsite命令总是很好,你可以比每次@Pyrite重命名文件更容易,更快地列出,禁用,启用网站 - Ghassen Telmoudi
默认情况下,似乎没有安装nginx_modsite。然而,重命名文件是一种股票期权。此外,我将我的答案作为替代方法的前缀,而不是最好的方法@GhassenTelmoudi - Pyrite
@Pyrite在Ubuntu 14.04上,扩展名不起作用,因为nginx.conf包含启用了站点的扩展名 include /etc/nginx/sites-enabled/*; 它只包括conf dir as *.conf - Bojan Markovic
@GhassenTelmoudi作为你一直提到的脚本是第三方脚本,它甚至没有被创建者(ubuntu)打包到nginx包中,你的注释建议在(一行)命令行替代上使用第三方脚本。这就是如何创建安全漏洞和不必要的复杂依赖树。 - scones
@BojanMarkovic,是的,Debian和Ubuntu是邪恶的 - serverfault.com/a/870618/110020  - 如果直接编辑文件,他们对任何文件的野外播放都会特别麻烦 sites-enabled,并且您的编辑器创建备份文件。 - cnst