Nginx включить команду сайта


131

Мы все знаем, как включить веб-сайт с помощью Apache на Linux. Я уверен, что мы все согласны с использованием команды a2ensite.

К сожалению, в Nginx не существует эквивалентной команды по умолчанию, но случилось так, что я установил какой-то пакет в Ubuntu, который позволил мне включить / отключить сайты и вывести их список.

Проблема в том, что я не помню название этого пакета.

Кто-нибудь знает, о чем я говорю?

Пожалуйста, скажите мне имя этого пакета и имя команды.


5
Утверждение о a2ensite не верно для CentOS
user9517

Ответы:


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

23
Тогда я не уверен, что вы действительно просите.
Пхамре

3
не забудьте перезагрузить сервер nginx с помощью: sudo service nginx reload
Ricardo Martins

16
@pkhamre: при использовании Apache есть два скрипта: a2ensite и a2dissite. Они просто создают и удаляют символические ссылки, которые вы описываете, поэтому они являются более быстрыми способами включения и отключения.
Мадс Скьерн

6
Спасибо за постоянные отклики на этот старый ответ. Если ОП примет этот ответ, это будет эпично :)
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 и вообще не хотел приглашения. Спасибо!
Радтек

да, это имеет смысл, вы можете сказать мне, где вы сделали изменения?
Гассен Тельмуди

10
Довольно большой скрипт для переноса некоторых стандартных однострочных команд.
Tobltobs

1
@tobltobs Хорошие программисты пишут код, отличные программисты крадут код :) Это прекрасное дополнение к моей коллекции серверных сценариев.
rdev5

5
@GhassenTelmoudi в качестве сценария, который вы постоянно упоминаете, является сторонним сценарием, который даже не упакован создателями (ubuntu) в пакет nginx, ваш комментарий предлагает использовать сторонний сценарий поверх (однострочной) альтернативы командной строки. Так создаются уязвимости безопасности и излишне сложные деревья зависимостей
scones

32

Вы имеете в виду nginx_ensiteи nginx_dissite?


16
Это едва ли ответ, не так ли? Этих команд нет в моей установке nginx, в Ubuntu, установленном с помощью apt-get. Похоже, что это просто сторонний сценарий: github.com/perusio/nginx_ensite
Мадс Скьерн

5
@MadsSkjern Если это «едва ли ответ», то принятый ответ тоже не очень-то один!
Майкл Хэмптон

3
Прежде всего, спасибо за ответ :) И прошу прощения за мой комментарий, который, возможно, звучит оскорбительно, когда я на самом деле хотел только отметить, что он был не очень полезен для меня (в то время), потому что предполагал слишком много из читатель.
Мэдс Скьерн

25
Вы ответили двумя командами и URL-адресом, и даже в форме вопроса. Как кто-то с моим низким уровнем опыта, ваш ответ послал бы меня туда. Может быть, я найду полезное руководство / учебное пособие / демонстрацию через 2 минуты, может быть, я бы искал около часа и все еще был бы в замешательстве. Тогда мне бы помогло следующее: «Есть эти инструменты nginx_ensite и nginx_dissite, это сторонний скрипт, скачайте его отсюда, и они работают таким образом, пример, пример». Ответ Гассена более сложный, более вводный, более полезный. Я надеюсь, вы понимаете, что я имею в виду :)
Мадс Скьерн

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-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создать файлы резервных копий (с ~суффиксом), а затем спросите меня снова.


4
Я хотел бы отметить, что проблема с этим ответом заключается в двух ошибочных предположениях относительно Debian и производных: 1) Назначение conf.dкаталога - настройка всего сервера, например, для модулей, плагинов, обработчиков fastcgi и т. Д., И явно не хранить хост / vhost конфигурации и 2) Не следует редактировать какие-либо файлы в sites-enabled serverfault.com/a/825297/86189
Боян Маркович,

@ BojanMarkovic, вы не правы. Вы не можете служить общесерверных конфигурации в conf.d, так как он включен в том же контексте, что и sites-enabledодин - http-уровне контексте, поэтому, модуль и плагин директивы могут не применяться. Аналогично, ваше предположение о том, что не следует редактировать файлы, sites-enabled- это всего лишь желаемое за действительное - в дистрибутиве или в каталоге нет таких инструкций, так что это чисто ваше предположение, которое никоим образом не поддерживается дистрибутивом, поэтому вы есть всевозможные проблемы, возникающие из этого, например, stackoverflow.com/q/45852224/1122270 .
CNST

Проблема, на которую вы указали, не имеет к этому никакого отношения. Я ошибаюсь по поводу того, conf.dчто, возможно, сопровождающий Debian Nginx (или, возможно, он поддерживается для совместимости с апстримом). О том, чтобы не редактировать файлы в sites-enabled, это не желаемое за действительное, а предполагаемый рабочий процесс под Apache, который они пытались эмулировать на Nginx. В apache это вполне очевидно из-за наличия a2ensiteи a2dissiteскриптов. К сожалению, ничего подобного не предусмотрено для Nginx, который показывает, насколько низко качество обслуживания этого пакета в Debian. У обоих нет документации, правда.
Боян Маркович

2
... Я дам вам это (документы ужасно не хватает в этом отношении). Тем не менее, вы первый человек, использующий веб-серверы в Debian, с которым я разговаривал, который был смущен этим. Простое ls -al sites-enabledв Apache или Nginx показывает, что существующие файлы в каталоге являются символическими ссылками -available, то же самое для модулей под Apache, вместе с предоставляемым a2enmod/ a2dismodscirpts.
Боян Маркович

1
@pzrq, вы приравниваете много несвязанных вещей; доступный / включенный не имеет ничего общего ни с apache, ни с debian; если нет доказательств обратного, то это просто то, что какой-то сопровождающий прокрался в нужное место в нужное время, когда никто не смотрел, и он застрял; есть небольшая причина продолжать использовать его, если вы уже тратите ресурсы на переход к nginx, что, например, уже потребовало бы переписывания конфигурации, чтобы избавиться от .htaccess - может также стандартизировать вашу конфигурацию с учетом всех облаков и дистрибутивов , что достаточно просто, conf.dкак есть.
CNST

1

Другой способ - просто переименовать файл конфигурации сайта во что-то, что заканчивается без .conf.

Например sudo mv mysite.conf mysite.conf.disabled

Затем перезагрузите nginx, и этот vhost вернется к значению по умолчанию.


всегда приятно использовать команду nginx_modsite, вы можете перечислять, отключать, включать сайт намного проще и быстрее, чем каждый раз переименовывать файл @Pyrite
Ghassen Telmoudi

3
@Pyrite В Ubuntu 14.04 расширение не имеет значения, так как nginx.conf включает сайты с включенной поддержкой, так как include /etc/nginx/sites-enabled/*;включает только conf dir as*.conf
Боян Маркович

2
@GhassenTelmoudi в качестве сценария, который вы постоянно упоминаете, является сторонним сценарием, который даже не упакован создателями (ubuntu) в пакет nginx, ваш комментарий предлагает использовать сторонний сценарий поверх (однострочной) альтернативы командной строки. Так создаются уязвимости безопасности и излишне сложные деревья зависимостей.
булочки

1
@cnst Я бы не стал называть это злом, особенно их выбором sites-availableи тем, sites-enabledчто у них есть свои достоинства и применение. Кто-то должен, вероятно, просто подать отчет об ошибке для истинной оскорбительной строки в nginx conf, /etc/nginx/sites-enabled/*.conf;и они, вероятно, будут это делать , поскольку это, вероятно, упущение. Но если вы уважаете рабочий процесс Debian, вы все равно будете редактировать файлы sites-availableи вставлять ссылки на те, в которые хотите включить sites-enabled.
Боян Маркович

1
@cnst Почему это так очевидно? Это позволяет включать и отключать ВХосты , не удаляя их, таким образом, является идентичным как на апача и Nginx. Тот факт, что вы заинтересованы исключительно в nginx, не отменяет намерения сопровождающих Debian предоставить одинаковый метод включения / выключения для обоих веб-серверов.
Боян Маркович,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.