Nginx abilita il comando del sito


131

Sappiamo tutti come abilitare un sito Web usando apache su Linux. Sono abbastanza sicuro che siamo tutti d'accordo sull'uso del comando a2ensite.

Sfortunatamente non esiste un comando equivalente predefinito fornito con Nginx, ma è successo che ho installato un pacchetto su Ubuntu che mi ha permesso di abilitare / disabilitare i siti ed elencarli.

Il problema è che non ricordo il nome di questo pacchetto.

Qualcuno sa di cosa sto parlando?

Per favore dimmi il nome di questo pacchetto e il nome del comando.


5
L'affermazione su a2ensite non è vera per CentOS
user9517

Risposte:


166

Se hai installato il nginxpacchetto dai repository Ubuntu, avrai due directory.

/etc/nginx/sites-enablede /etc/nginx/sites-available.

Nella configurazione principale di nginx /etc/nginx/nginx.conf, hai la seguente riga:

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

Quindi, in pratica, per elencare tutti gli host virtuali disponibili, è possibile eseguire il comando seguente:

ls /etc/nginx/sites-available

Per attivare uno di essi, eseguire il comando seguente:

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

Gli script forniti con Apache sono fondamentalmente solo semplici involucri shell che fanno qualcosa di simile come sopra.

Dopo aver collegato i file, ricordati di eseguire sudo service nginx reload/service nginx reload


5
Sì, lo so usando la riga di comando, grazie
Ghassen Telmoudi,

23
Quindi non sono sicuro di cosa tu stia davvero chiedendo.
pkhamre,

3
ricordati di ricaricare il server nginx con: sudo service nginx reload
Ricardo Martins

16
@pkhamre: quando si utilizza Apache ci sono due script: a2ensite e a2dissite. Semplicemente creano ed eliminano i collegamenti simbolici che descrivi, quindi sono modi più veloci di abilitare e disabilitare.
Mads Skjern,

6
Grazie per i costanti voti su questa vecchia risposta. Se OP accettasse questa risposta sarebbe epico :)
pkhamre il

69

Basta creare questo script /usr/bin/nginx_modsitee renderlo eseguibile.

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

Come funziona:

Per elencare tutti i siti

$ sudo nginx_modsite -l

Per abilitare il sito "test_website"

$ sudo nginx_modsite -e test_website

Per disabilitare il sito "test_website"

$ sudo nginx_modsite -d test_website

nella funzione ngx_relaod, ho commentato la lettura e ho fatto reload = "y" poiché eseguo questo tramite cron e non volevo affatto il prompt. Grazie!
Radtek,

sì, ha perfettamente senso, puoi dirmi dove hai apportato il cambiamento?
Ghassen Telmoudi,

10
Uno script abbastanza grande per avvolgere alcuni comandi standard di una riga.
tobltobs,

1
@tobltobs I bravi programmatori scrivono codice, i grandi programmatori rubano il codice :) Questo fa una bella aggiunta alla mia collezione di script di imaging del server.
rdev5,

5
@GhassenTelmoudi come script che continui a menzionare è uno script di terze parti, che non è nemmeno impacchettato dai creatori (ubuntu) nel pacchetto nginx, il tuo commento suggerisce di utilizzare uno script di terze parti su un'alternativa alla riga di comando (una riga). È così che vengono create vulnerabilità di sicurezza e alberi di dipendenza inutilmente complessi
focaccine al

32

Ti riferisci a nginx_ensitee nginx_dissite?


16
Questa è a malapena una risposta, vero? Questi comandi non sono presenti sulla mia installazione di nginx, su Ubuntu installato con apt-get. Sembra che sia solo uno script di terze parti: github.com/perusio/nginx_ensite
Mads Skjern

5
@MadsSkjern Se questa è "a malapena una risposta", allora la risposta accettata non è neanche una di queste!
Michael Hampton

3
Prima di tutto, grazie per aver risposto :) E scusate il mio commento, che forse sembra offensivo, quando in realtà volevo solo sottolineare che non era molto utile per me (al momento), a causa del fatto che presupponeva troppo dal lettore.
Mads Skjern,

25
Hai risposto con due comandi e un URL, e anche sotto forma di una domanda. Come qualcuno con il mio basso livello di esperienza, la tua risposta mi avrebbe mandato a cercare su Google. Forse avrei trovato una guida / tutorial / demo utile in 2 minuti, forse mi sarei guardato intorno per un'ora e sarei ancora confuso. Ciò che mi avrebbe aiutato allora era: "Esistono questi strumenti nginx_ensite e nginx_dissite, è uno script di terze parti, scaricalo da qui e funzionano in questo modo, esempio, esempio". La risposta di Ghassen è più elaborata, più introduttiva, più utile. Spero tu capisca cosa intendo :)
Mads Skjern

8
@MadsSkjern Bene, avresti potuto semplicemente fare clic sul collegamento. :)
Michael Hampton

4

Nginx

Se stai usando uno dei pacchetti upstream ufficiali di nginx da http://nginx.org/packages/ , il modo migliore è quello di navigare nella /etc/nginx/conf.ddirectory e rinominare il file interessato dall'avere un .confsuffisso per averne uno diverso da disabilita il sito:

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

O il contrario per abilitarlo:

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

Questo perché il valore predefinito /etc/nginx/nginx.confha la seguente includedirettiva:

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

Debian / Ubuntu

Tuttavia, se stai usando un derivato Debian / Ubuntu, oltre a conf.d, potresti anche avere il male non standardsites-available e le sites-enableddirectory, alcuni file sotto i quali potrebbero essere sciatti inclusi senza riguardo alla loro estensione:

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

Pertanto, in Debian / Ubuntu, potresti prima dover capire dove si trova la configurazione del sito.

  • È possibile utilizzare il comando seguente per ottenere un elenco di tutti i siti disponibili eseguendo find(1)per trovare tutti i file regolari corrispondenti alla maschera fornita:

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

  • È possibile utilizzare il comando seguente per ottenere un elenco di tutti i siti abilitati :

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

Quindi per disabilitare / abilitare i siti su Debian / Ubuntu:

  • Per disabilitare un sito: se la configurazione è attiva conf.d, basta rinominare il file per non avere più un .confsuffisso; o se dentro sites-enabled, spostalo fuori sites-enabled.

  • Per abilitare un sito, il modo migliore sarebbe spostarlo /etc/nginx/conf.de rinominarlo per avere un .confsuffisso.

PS Perché penso che Debian include /etc/nginx/sites-enabled/*;sia malvagio? Prova a modificare un paio di file in quella directory e fai emacscreare i file di backup (con il ~suffisso), quindi chiedimi di nuovo.


4
Vorrei sottolineare che il problema con questa risposta risiede in due assunti errati riguardanti Debian e derivati: 1) Lo scopo della conf.ddirectory è la configurazione a livello di server come quella per moduli, plugin, gestori fastcgi ecc. E esplicitamente non memorizzare l'host / configurazioni vhost in e 2) Uno non dovrebbe modificare alcun file in sites-enabled serverfault.com/a/825297/86189
Bojan Markovic

@BojanMarkovic, ti sbagli. Non è possibile fornire configurazioni a livello di server conf.d, poiché è incluso nello stesso contesto del contesto a sites-enabledun httplivello, quindi le direttive sui moduli e sui plug-in potrebbero non essere applicabili. Allo stesso modo, il tuo presupposto che uno non dovrebbe modificare i file sites-enabledè solo un pio desiderio - non ci sono tali istruzioni all'interno della distro, o all'interno della directory, quindi, è puramente il tuo presupposto, che non è in alcun modo applicato dalla distribuzione, quindi, tu presenta ogni sorta di problemi che ne derivano, ad esempio stackoverflow.com/q/45852224/1122270 .
primo

Il problema che hai indicato non ha assolutamente alcun legame con questo. Sbaglio conf.dcome è, probabilmente, il manutentore Debian di Nginx (o forse è mantenuto per compatibilità con l'upstream). A proposito di non modificare i file sites-enabled, non è un pio desiderio, ma il presunto worflow sotto Apache che hanno cercato di emulare su Nginx. In apache è abbastanza ovvio a causa dell'esistenza a2ensitee degli a2dissitescript. Sfortunatamente non viene fornito nulla del genere per Nginx che mostra quanto sia bassa la qualità di manutenzione di quel pacchetto su Debian. Entrambi mancano di documentazione, vero.
Bojan Markovic,

2
.. te lo darò (i documenti mancano in modo abissale a questo proposito). Comunque sei la prima persona che esegue i server web su Debian con cui ho parlato che ne è stato confuso. Solo un semplice ls -al sites-enabledin Apache o Nginx mostra che i file esistenti nella directory sono collegamenti simbolici -available, idem per i moduli in Apache, insieme a fornito a2enmod/ a2dismodscirpts.
Bojan Markovic,

1
@pzrq, stai equiparando molte cose non correlate; il disponibile / abilitato non ha nulla a che fare con apache né debian; in mancanza di prove contrarie, è fondamentalmente solo qualcosa che un manutentore si è intrufolato nel posto giusto al momento giusto quando nessuno stava guardando, e si è bloccato; ci sono pochi motivi per continuare a usarlo se stai già spendendo le risorse per passare a nginx, che richiederebbe già riscritture di configurazione per sbarazzarsi di .htaccess, per esempio - potrebbe anche standardizzare la tua configurazione con tutte le nuvole e le distro in mente , che è abbastanza facile con così conf.dcom'è.
primo

1

Un altro metodo è solo quello di rinominare il file di configurazione del sito in qualcosa che termina senza .conf

Per esempio sudo mv mysite.conf mysite.conf.disabled

Quindi ricaricare nginx e quel vhost tornerà al valore predefinito.


è sempre bello usare il comando nginx_modsite, puoi elencare, disabilitare, abilitare il sito molto più facile e veloce, che rinominare il file ogni volta che @Pyrite
Ghassen Telmoudi,

3
@Pyrite Su Ubuntu 14.04 l'estensione non ha importanza poiché nginx.conf include siti abilitati in include /etc/nginx/sites-enabled/*;quanto include solo la directory di configurazione come*.conf
Bojan Markovic

2
@GhassenTelmoudi come script che continui a menzionare è uno script di terze parti, che non è nemmeno impacchettato dai creatori (ubuntu) nel pacchetto nginx, il tuo commento suggerisce di utilizzare uno script di terze parti su un'alternativa alla riga di comando (una riga). Ecco come vengono create vulnerabilità della sicurezza e alberi di dipendenza inutilmente complessi.
focaccine

1
@cnst Non andrei fino al punto di chiamarlo malvagio, in particolare la loro scelta sites-availablee sites-enabledcome hanno merito e uso. Qualcuno dovrebbe probabilmente solo presentare una segnalazione di bug per la vera linea offensiva in nginx conf /etc/nginx/sites-enabled/*.conf;e probabilmente lo faranno perché probabilmente è una svista. Ma se rispetti il ​​flusso di lavoro Debian, modificherai sites-availablecomunque i file e collegherai in modo simbolico quelli che vuoi abilitare sites-enabled.
Bojan Markovic,

1
@cnst Il perché è abbastanza evidente, no? Ti consente di abilitare e disabilitare i vhosts senza eliminarli, in modo identico su apache e nginx. Il fatto che tu sia interessato esclusivamente a nginx non invalida l'intento dei manutentori di Debian di fornire il metodo di abilitazione / disabilitazione simile per entrambi i server web.
Bojan Markovic,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.