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.