Nginx włącz polecenie strony


131

Wszyscy wiemy, jak włączyć stronę internetową za pomocą apache w systemie Linux. Jestem pewien, że wszyscy zgadzamy się na użycie polecenia a2ensite.

Niestety nie ma domyślnej równoważnej komendy dostarczanej z Nginx, ale zdarzyło się, że zainstalowałem jakiś pakiet na Ubuntu, który pozwolił mi włączyć / wyłączyć witryny i wyświetlić je.

Problem polega na tym, że nie pamiętam nazwy tego pakietu.

Czy ktoś wie o czym mówię?

Podaj mi nazwę tego pakietu i nazwę polecenia.


5
Twierdzenie o a2ensite nie jest prawdziwe w przypadku CentOS
user619714,

Odpowiedzi:


166

Jeśli zainstalowałeś nginxpakiet z repozytoriów Ubuntu, będziesz mieć dwa katalogi.

/etc/nginx/sites-enableda /etc/nginx/sites-available.

W głównej konfiguracji nginx /etc/nginx/nginx.confmasz następujący wiersz:

include /etc/nginx/sites-enabled/*.conf;

Aby wyświetlić listę wszystkich dostępnych wirtualnych hostów, możesz uruchomić następującą komendę:

ls /etc/nginx/sites-available

Aby aktywować jedno z nich, uruchom następujące polecenie:

ln -s /etc/nginx/sites-available/www.example.org.conf /etc/nginx/sites-enabled/

Skrypty dostarczane z Apache to po prostu proste opakowanie powłoki, które robi coś podobnego jak powyżej.

Po połączeniu plików pamiętaj, aby uruchomić sudo service nginx reload/service nginx reload


5
Tak, wiem jak to zrobić za pomocą wiersza poleceń, dzięki
Ghassen Telmoudi,

23
Więc nie jestem pewien, o co tak naprawdę prosisz.
pkhamre

3
pamiętaj, aby przeładować serwer nginx za pomocą: sudo service nginx reload
Ricardo Martins

16
@pkhamre: Podczas korzystania z Apache istnieją dwa skrypty: a2ensite i a2dissite. Po prostu tworzą i usuwają opisywane linki symboliczne, dzięki czemu są szybszymi sposobami włączania i wyłączania.
Mads Skjern,

6
Dzięki za ciągłe przychylność tej starej odpowiedzi. Jeśli OP przyjmie tę odpowiedź, będzie to epicka :)
pkhamre

69

Po prostu utwórz ten skrypt /usr/bin/nginx_modsitei wykonaj go.

#!/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

Jak to działa:

Aby wyświetlić listę wszystkich witryn

$ sudo nginx_modsite -l

Aby włączyć witrynę „test_website”

$ sudo nginx_modsite -e test_website

Aby wyłączyć witrynę „test_website”

$ sudo nginx_modsite -d test_website

w funkcji ngx_relaod skomentowałem odczyt i po prostu zmieniłem reload = "y", ponieważ uruchamiam to przez crona i wcale nie chcę znaku zachęty. Dzięki!
radtek

tak, to ma sens, czy możesz mi powiedzieć, gdzie dokonałeś zmiany?
Ghassen Telmoudi

10
Dość duży skrypt do zawijania niektórych standardowych poleceń jednowierszowych.
tobltobs

1
@tobltobs Dobrzy programiści piszą kod, świetni programiści kradną kod :) To miły dodatek do mojej kolekcji skryptów do obrazowania serwerów.
rdev5,

5
@GhassenTelmoudi, ponieważ skrypt, o którym ciągle wspominasz, jest skryptem strony trzeciej, który nie jest nawet spakowany przez twórców (ubuntu) w pakiecie nginx, twój komentarz sugeruje użycie skryptu innej firmy zamiast (jednowierszowej) linii poleceń. W ten sposób powstają luki w zabezpieczeniach i niepotrzebnie złożone drzewa zależności
scones

32

Masz na myśli nginx_ensitei nginx_dissite?


16
To ledwie odpowiedź, prawda? Te polecenia nie są obecne w mojej instalacji nginx na Ubuntu zainstalowanej z apt-get. Wygląda na to, że jest to tylko skrypt innej firmy: github.com/perusio/nginx_ensite
Mads Skjern

5
@MadsSkjern Jeśli jest to „ledwie odpowiedź”, wówczas odpowiedź nie jest zbyt duża!
Michael Hampton

3
Przede wszystkim dziękuję za odpowiedź :) I przepraszam za mój komentarz, który może zabrzmi obraźliwie, kiedy tak naprawdę chciałem tylko zaznaczyć, że nie był on dla mnie bardzo przydatny (w tym czasie), ponieważ zbyt wiele z niego zakładał czytelnik.
Mads Skjern

25
Odpowiedziałeś dwoma poleceniami i adresem URL, a nawet w formie pytania. Jako ktoś z moim niskim poziomem doświadczenia, twoja odpowiedź wysłałaby mnie tam, gdzie google. Może znajdę pomocnego przewodnika / tutoriala / demo za 2 minuty, może rozejrzę się przez godzinę i nadal będę zdezorientowany. Pomogło mi wtedy: „Istnieją narzędzia nginx_ensite i nginx_dissite, jest to skrypt innej firmy, pobierz go stąd i działają w ten sposób, przykład, przykład”. Odpowiedź Ghassena jest bardziej złożona, bardziej wprowadzająca, bardziej pomocna. Mam nadzieję, że rozumiesz, co mam na myśli :)
Mads Skjern

8
@MadsSkjern Cóż, mógłbyś właśnie kliknąć link. :)
Michael Hampton

4

NGINX

Jeśli używasz jednego z oficjalnych pakietów nginx z http://nginx.org/packages/ , najlepszym sposobem jest przejście do /etc/nginx/conf.dkatalogu i zmiana nazwy pliku, którego dotyczy problem, z .confprzyrostka na inny na wyłącz witrynę:

sudo mv -i /etc/nginx/conf.d/default.conf{,.off}

Lub odwrotnie, aby to włączyć:

sudo mv -i /etc/nginx/conf.d/example.com.conf{.disabled,}

Jest tak, ponieważ domyślnie /etc/nginx/nginx.confma następującą includedyrektywę:

http {
    …
    include /etc/nginx/conf.d/*.conf;
}

Debian / Ubuntu

Jednakże, jeśli używasz pochodnej Debian / Ubuntu, to oprócz tego conf.dmożesz mieć złe niestandardowesites-available i sites-enabledkatalogi, niektóre pliki, pod którymi można niechętnie zawierać, bez względu na ich rozszerzenie:

http {
    …
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

W związku z tym w Debian / Ubuntu może być najpierw konieczne ustalenie, gdzie znajduje się konfiguracja witryny.

  • Możesz użyć następującego polecenia, aby uzyskać listę wszystkich dostępnych witryn, uruchamiając się, find(1)aby znaleźć wszystkie zwykłe pliki pasujące do danej maski:

    find /etc/nginx -maxdepth 2 -type f \( -path "*/conf.d/*.conf" -or -path "*/sites-*/*" \)

  • Możesz użyć następującego polecenia, aby uzyskać listę wszystkich włączonych witryn:

    find /etc/nginx -maxdepth 2 \( -path "*/conf.d/*.conf" -or -path "*/sites-enabled/*" \)

Następnie, aby wyłączyć / włączyć witryny w Debian / Ubuntu:

  • Aby wyłączyć witrynę: jeśli konfiguracja jest włączona conf.d, po prostu zmień nazwę pliku, aby nie mieć już .confprzyrostka; lub jeśli jest sites-enabled, usuń go sites-enabled.

  • Aby włączyć witrynę, najlepszym sposobem jest przeniesienie jej do witryny /etc/nginx/conf.di zmiana nazwy na .confprzyrostek.

PS Dlaczego myślę, że Debian include /etc/nginx/sites-enabled/*;jest zły? Spróbuj edytować kilka plików w tym katalogu i poproś emacso utworzenie plików kopii zapasowej (z ~przyrostkiem), a następnie zapytaj mnie ponownie.


4
Chciałbym zauważyć, że problem z tą odpowiedzią leży w dwóch błędnych założeniach dotyczących Debiana i pochodnych: 1) Celem conf.dkatalogu jest konfiguracja na całym serwerze, taka jak dla modułów, wtyczek, programów obsługi Fastcgi itp. I jawnie nie do przechowywania hosta / vhost konfiguracje w i 2) Nie należy edytować żadnych plików w sites-enabled serverfault.com/a/825297/86189
Bojan Markovic,

@BojanMarkovic, mylisz się. Nie możecie służyć konfiguracjach serwerowych szeroko conf.d, ponieważ jest ona zawarta w tym samym kontekście, co sites-enabledone - http-level kontekście, więc dyrektyw moduł i plugin mogą nie mieć zastosowania. Podobnie twoje założenie, że nie należy edytować plików, sites-enabledjest jedynie pobożnym życzeniem - nie ma takich instrukcji w dystrybucji ani w katalogu, więc jest to wyłącznie twoje założenie, które nie jest w żaden sposób narzucone przez dystrybucję, więc występują różnego rodzaju problemy z tego wynikające, np . stackoverflow.com/q/45852224/1122270 .
cnst

Problem, który wskazałeś, nie ma z tym żadnego związku. Mylę się co conf.ddo prawdopodobnie opiekuna Debiana dla Nginx (a może jest on utrzymywany w celu zachowania zgodności z poprzednimi wersjami). Jeśli chodzi o brak edytowania plików sites-enabled, to nie jest pobożne życzenie, ale rzekomy przepływ pod Apache, który próbowali emulować na Nginx. W Apache jest to dość oczywiste ze względu na istnienie a2ensitei a2dissiteskrypty. Niestety dla Nginx nie ma nic takiego, co pokazuje, jak niska jest jakość utrzymania tego pakietu w Debianie. Oba brakuje dokumentacji, to prawda.
Bojan Markovic

2
.. Dam ci to (dokumentom brakuje pod tym względem absolutnie). Jednak jesteś pierwszą osobą zarządzającą serwerami WWW na Debianie, z którą rozmawiałem, co było przez to mylące. Po prostu prosty ls -al sites-enabledw Apache lub Nginx pokazuje, że istniejące pliki w katalogu to dowiązania symboliczne -available, to samo dotyczy modułów pod Apache, wraz z zapewnionymi a2enmod/ a2dismodscirpts.
Bojan Markovic

1
@pzrq, zrównujesz wiele niepowiązanych rzeczy; dostępne / włączone nie ma nic wspólnego z Apache ani Debianem; jeśli nie ma dowodów przeciwnych, jest to po prostu coś, co jakiś opiekun zakradł się we właściwe miejsce we właściwym czasie, gdy nikt nie patrzył, i utknęło; nie ma powodu, aby kontynuować korzystanie z niego, jeśli już przeznaczasz zasoby na przejście na Nginx, co wymagałoby już przepisania konfiguracji, aby na przykład pozbyć się pliku .htaccess - równie dobrze może standaryzować konfigurację z uwzględnieniem wszystkich chmur i dystrybucji , co jest dość łatwe w obecnej conf.dpostaci.
cnst

1

Inną metodą jest zmiana nazwy pliku konfiguracyjnego witryny na coś, co kończy się bez .conf

Na przykład sudo mv mysite.conf mysite.conf.disabled

Następnie przeładuj nginx, a ten vhost powróci do ustawień domyślnych.


zawsze miło jest użyć polecenia nginx_modsite, możesz łatwiej, szybciej i szybciej wyświetlać listę, wyłączać i włączać witrynę, niż zmieniać nazwę pliku za każdym razem @Pyrite
Ghassen Telmoudi

3
@Pyrite Na Ubuntu 14.04 rozszerzenie nie ma znaczenia, ponieważ nginx.conf zawiera obsługę stron, ponieważ include /etc/nginx/sites-enabled/*;zawiera tylko conf dir as*.conf
Bojan Markovic

2
@GhassenTelmoudi, ponieważ skrypt, o którym ciągle wspominasz, jest skryptem strony trzeciej, który nie jest nawet spakowany przez twórców (ubuntu) w pakiecie nginx, twój komentarz sugeruje użycie skryptu innej firmy zamiast (jednowierszowej) linii poleceń. W ten sposób powstają luki w zabezpieczeniach i niepotrzebnie złożone drzewa zależności.
bułeczki

1
@ cnst Nie posunąłbym się tak daleko, by nazwać to złem, szczególnie ich wybór sites-availablei sites-enabledjak mają zalety i zastosowanie. Ktoś prawdopodobnie powinien po prostu zgłosić raport o błędzie dla prawdziwej linii obrażeń w nginx conf /etc/nginx/sites-enabled/*.conf;i prawdopodobnie zrobi to, ponieważ prawdopodobnie jest to przeoczenie. Ale jeśli szanujesz przepływ pracy w Debianie, i tak edytujesz pliki sites-availablei łączysz te, w których chcesz włączyć sites-enabled.
Bojan Markovic

1
@cnst Dlaczego to jest dość oczywiste, prawda? Umożliwia włączanie i wyłączanie vhostów bez usuwania ich w sposób identyczny zarówno w apache, jak i nginx. Fakt, że interesujesz się wyłącznie nginx, nie unieważnia zamiaru opiekunów Debiana, aby zapewnić podobną metodę włączania / wyłączania dla obu serwerów WWW.
Bojan Markovic,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.