Команда для ввімкнення сайту Nginx


131

Всі ми знаємо, як увімкнути веб-сайт за допомогою apache на Linux. Я майже впевнений, що всі ми згодні з використанням команди a2ensite.

На жаль, не існує команди за замовчуванням еквівалентної команди з Nginx, але траплялося, що я встановив якийсь пакет на ubuntu, який дозволив мені вмикати / відключати сайти та перераховувати їх.

Проблема в тому, що я не пам'ятаю назву цього пакета.

Хтось знає, про що я говорю?

Скажіть, будь ласка, ім'я цього пакета та ім'я команди.


5
Твердження про a2ensite не вірно для CentOS
— user619714

Відповіді:


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
Тоді я не впевнений, що ви насправді просите.
— pkhamre

3
не забудьте перезавантажити сервер nginx за допомогою: sudo service nginx reload
— Рікардо Мартінс,

16
@pkhamre: При використанні Apache є два сценарії: a2ensite та a2dissite. Вони просто створюють та видаляють описувані вами символічні посилання, тому вони є швидшими способами включення та відключення.
— Mads Skjern

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 я прокоментував прочитане і просто перезавантажую = "y", оскільки я запускаю це через cron і зовсім не хотів запиту. Дякую!
— radtek

так, це має ідеальний сенс, чи можете ви сказати мені, де ви внесли зміни?
— Ghassen Telmoudi

10
Досить великий сценарій для обгортання деяких стандартних команд на один рядок.
— tobltobs

1
@tobltobs Хороші програмісти пишуть код, чудові програмісти крадуть код :) Це приємно доповнить мою колекцію сценаріїв зображень сервера.
— rdev5

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

32

Ви посилаєтесь на nginx_ensiteта nginx_dissite?


16
Це ледве відповідь, чи не так? Ці команди відсутні в моїй установці nginx, на Ubuntu, встановленому apt-get. Схоже, це просто сценарій третьої сторони: github.com/perusio/nginx_ensite
— Mads Skjern

5
@MadsSkjern Якщо це "ледь відповідь", то прийнята відповідь теж не одна!
— Майкл Хемптон

3
Перш за все, дякую за відповідь :) І вибачте за мій коментар, який, мабуть, звучить образливо, коли я насправді хотів лише зазначити, що це було не дуже корисно для мене (на той час), оскільки він припускає занадто багато читач.
— Mads Skjern

25
Ви відповіли двома командами та URL-адресою, і навіть у формі запитання. Як хтось із моїм низьким рівнем досвіду, ваша відповідь надіслала б мене туди гуглити. Можливо, я за 2 хвилини знайду корисний посібник / підручник / демонстрацію, можливо, я б озирнувся протягом години і все ще розгубився. Що б мені тоді допомогло: "Є ці інструменти nginx_ensite та nginx_dissite. Це сценарій сторонньої сторони, завантажте його звідси, і вони працюють так, наприклад, приклад". Відповідь Гассена більш детальна, вступніша, корисніша. Сподіваюся, ви зрозуміли, що я маю на увазі :)
— Mads Skjern

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 сервері defaultfault.com/a/825297/86189
— Bojan Markovic

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

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

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

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

1

Інший метод - просто перейменувати конфігураційний файл сайту на те, що закінчується без .conf

Напр sudo mv mysite.conf mysite.conf.disabled

Потім перезавантажте nginx, і цей vhost повернеться до типового.


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

3
@Pyrite On Ubuntu 14.04, розширення не означає, що nginx.conf включає сайти з увімкненим веб-сайтом, оскільки include /etc/nginx/sites-enabled/*;воно включає лише конфіденційність*.conf
— Bojan Markovic

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

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

1
@cnst Чому це цілком само собою зрозуміло, чи не так? Це дає змогу вмикати та вимикати vhosts, не видаляючи їх, таким чином, що є ідентичним як для apache, так і для nginx. Той факт, що ви виключно зацікавлені в nginx, не приводить до недійсності намірів підтримуваних Debian забезпечити подібний метод включення / відключення для обох веб-серверів.
— Боян Маркович
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.