Команда для ввімкнення сайту 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.