我们都知道如何在Linux上使用apache启用网站。我很确定我们都同意使用a2ensite命令。
不幸的是,Nginx没有默认的等效命令,但是确实发生了,我在ubuntu上安装了一些软件包,使我可以启用/禁用站点并列出它们。
问题是我不记得这个软件包的名称。
有人知道我在说什么吗?
请告诉我这个软件包的名称和命令名称。
我们都知道如何在Linux上使用apache启用网站。我很确定我们都同意使用a2ensite命令。
不幸的是,Nginx没有默认的等效命令,但是确实发生了,我在ubuntu上安装了一些软件包,使我可以启用/禁用站点并列出它们。
问题是我不记得这个软件包的名称。
有人知道我在说什么吗?
请告诉我这个软件包的名称和命令名称。
Answers:
如果您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
只需创建此脚本/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
您是指nginx_ensite
和nginx_dissite
吗?
如果您使用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衍生产品,则除了之外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
后缀。
PS:为什么我认为Debian include /etc/nginx/sites-enabled/*;
是邪恶的?尝试在该目录中编辑几个文件,然后emacs
创建备份文件(带~
后缀),然后再次询问我。
conf.d
目录的目的是在服务器范围内进行配置,例如用于模块,插件,fastcgi处理程序等,并且明确地不存储主机和中的/ vhost配置2)一个人不应编辑sites-enabled
serverfault.com/a/825297/86189中的
conf.d
,因为它包含在与sites-enabled
一个http
级别的上下文相同的上下文中,因此,模块和插件指令可能不适用。同样,您认为不应编辑文件的假设sites-enabled
只是一厢情愿–发行版或目录中没有这样的指令,因此,这纯粹是您的假设,而发行版绝对不会执行此假设,因此,您由此引起的各种问题,例如stackoverflow.com/q/45852224/1122270。
conf.d
可能是Nginx的Debian维护者(或者为了与上游的兼容性而保留),这是错误的。关于不编辑中的文件sites-enabled
,这不是一厢情愿的想法,而是他们试图在Nginx上模仿的Apache下的假想流程。在Apache中,由于a2ensite
和a2dissite
脚本的存在,这一点很明显。不幸的是,Nginx没有提供任何种类的信息,这表明该软件包在Debian上的维护质量有多低。两者都缺少文档,是真的。
ls -al sites-enabled
Apache或Nginx中的一个简单示例显示目录中的现有文件是Apache中的-available
模块的,从ditto到从符号链接以及提供的a2enmod
/ a2dismod
scirpts。
conf.d
。
另一种方法是将站点的配置文件重命名为不带.conf的文件
例如 sudo mv mysite.conf mysite.conf.disabled
然后重新加载nginx,该虚拟主机将恢复为默认值。
include /etc/nginx/sites-enabled/*;
它仅包含conf目录,如*.conf
sites-available
,并sites-enabled
为他们做有可取之处和使用。有人可能只应该为nginx conf中的真正违规行提交错误报告/etc/nginx/sites-enabled/*.conf;
,他们可能会因为疏忽而将其提交。但是,如果您尊重Debian工作流程,则sites-available
无论如何都将编辑文件,并将要启用的文件符号链接到中sites-enabled
。