Befehl Nginx enable site

131

Wir alle wissen, wie man eine Website mit Apache unter Linux aktiviert. Ich bin mir ziemlich sicher, dass wir uns alle auf die Verwendung des Befehls a2ensite einig sind.

Leider gibt es mit Nginx keinen entsprechenden Standardbefehl, aber es kam vor, dass ich ein Paket auf Ubuntu installiert habe, mit dem ich Websites aktivieren / deaktivieren und auflisten konnte.

Das Problem ist, ich erinnere mich nicht an den Namen dieses Pakets.

Weiß jemand, wovon ich spreche?

Bitte geben Sie den Namen dieses Pakets und den Befehlsnamen an.

Ghassen Telmoudi
quelle
5
Die Behauptung über a2ensite gilt nicht für CentOS
user9517

Antworten:

166

Wenn Sie das nginxPaket aus den Ubuntu-Repositorys installiert haben , haben Sie zwei Verzeichnisse.

/etc/nginx/sites-enabledund /etc/nginx/sites-available.

In der Hauptkonfiguration von nginx /etc/nginx/nginx.confhaben Sie die folgende Zeile:

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

Grundsätzlich können Sie den folgenden Befehl ausführen, um alle verfügbaren virtuellen Hosts aufzulisten:

ls /etc/nginx/sites-available

Führen Sie zum Aktivieren eines dieser Befehle den folgenden Befehl aus:

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

Die Skripte, die mit Apache geliefert werden, sind im Grunde nur einfache Shell-Wrapper, die etwas Ähnliches wie oben tun.

Denken Sie nach dem Verknüpfen der Dateien daran, sudo service nginx reload/ auszuführen .service nginx reload

pkhamre
quelle
5
Ja, ich weiß, wie man das über die Kommandozeile macht, danke
Ghassen Telmoudi
23
Dann bin ich mir nicht sicher, wonach du wirklich fragst.
pkhamre
3
Denken Sie daran, Nginx Server neu zu laden mit: Sudo Service Nginx Reload
Ricardo Martins
16
@pkhamre: Bei Verwendung von Apache gibt es zwei Skripte: a2ensite und a2dissite. Sie erstellen und löschen einfach die von Ihnen beschriebenen symbolischen Links, sodass Sie sie schneller aktivieren und deaktivieren können.
Mads Skjern
6
Vielen Dank für die ständigen Verbesserungen dieser alten Antwort. Wenn OP diese Antwort akzeptieren würde, wäre es episch :)
pkhamre
69

Erstellen Sie einfach dieses Skript /usr/bin/nginx_modsiteund machen Sie es ausführbar.

#!/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 <[email protected]>

# 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

Wie es funktioniert:

Um alle Websites aufzulisten

$ sudo nginx_modsite -l

So aktivieren Sie die Site "test_website"

$ sudo nginx_modsite -e test_website

So deaktivieren Sie die Site "test_website"

$ sudo nginx_modsite -d test_website
Ghassen Telmoudi
quelle
in der Funktion ngx_relaod habe ich das read auskommentiert und nur reload = "y" gemacht, da ich dies über cron ausgeführt habe und die Eingabeaufforderung überhaupt nicht wollte. Vielen Dank!
Radtek
Ja, das ergibt den perfekten Sinn. Können Sie mir sagen, wo Sie die Änderung vorgenommen haben?
Ghassen Telmoudi
10
Ein ziemlich großes Skript zum Umbrechen einiger Standardbefehle mit einer Zeile.
tobltobs
1
@ tobltobs Gute Programmierer schreiben Code, gute Programmierer stehlen Code :) Dies ist eine schöne Ergänzung zu meiner Sammlung von Server-Imaging-Skripten.
Rdev5
5
@GhassenTelmoudi als das Skript, das Sie immer wieder erwähnen, ist ein Skript eines Drittanbieters, das nicht einmal von den Erstellern (Ubuntu) in das nginx-Paket gepackt wurde. In Ihrem Kommentar wird empfohlen, ein Skript eines Drittanbieters über eine (einzeilige) Befehlszeilenalternative zu verwenden. So entstehen Sicherheitslücken und unnötig komplexe Abhängigkeitsbäume
scones
32

Beziehen Sie sich auf nginx_ensiteund nginx_dissite?

Michael Hampton
quelle
16
Das ist kaum eine Antwort, oder? Diese Befehle sind bei meiner Installation von nginx auf Ubuntu, das mit apt-get installiert wurde, nicht vorhanden. Es scheint nur ein Skript eines Drittanbieters zu sein: github.com/perusio/nginx_ensite
Mads Skjern
5
@MadsSkjern Wenn dies "kaum eine Antwort" ist, dann ist die akzeptierte Antwort auch nicht viel von einer!
Michael Hampton
3
Zuallererst danke für die Antwort :) Und entschuldigung für meinen Kommentar, der sich vielleicht beleidigend anhört, als ich eigentlich nur darauf hinweisen wollte, dass er für mich (zu der Zeit) nicht sehr nützlich war, weil ich zu viel von dem angenommen habe Leser.
Mads Skjern
25
Sie haben mit zwei Befehlen und einer URL und sogar in Form einer Frage geantwortet. Als jemand mit meiner geringen Erfahrung hätte mich Ihre Antwort zum Googeln gebracht. Vielleicht würde ich in 2 Minuten eine hilfreiche Anleitung / Anleitung / Demo finden, vielleicht würde ich mich eine Stunde lang umsehen und trotzdem verwirrt sein. Was mir damals geholfen hätte war: "Es gibt diese Tools nginx_ensite und nginx_dissite, es ist ein Skript von Drittanbietern, lade es von hier herunter und sie funktionieren so, Beispiel, Beispiel". Ghassens Antwort ist ausführlicher, einleitender, hilfreicher. Ich hoffe du verstehst was ich meine :)
Mads Skjern
8
@MadsSkjern Nun, du hättest einfach auf den Link klicken können. :)
Michael Hampton
4

NGINX

Wenn Sie eines der offiziellen Upstream-Pakete von nginx von http://nginx.org/packages/ verwenden , ist es am besten, zum /etc/nginx/conf.dVerzeichnis zu navigieren und die betroffene Datei von einem .confSuffix in ein anderes umzubenennen deaktiviere die Seite:

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

Oder das Gegenteil, um es zu aktivieren:

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

Dies liegt daran, dass die Standardeinstellung /etc/nginx/nginx.confdie folgende includeAnweisung enthält:

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

Debian / Ubuntu

Wenn Sie jedoch ein Debian / Ubuntu-Derivat verwenden, conf.dkönnen Sie zusätzlich zu den bösen Nicht-Standard-sites-available und sites-enabledVerzeichnissen auch einige Dateien haben, unter denen sich schlampig etwas befinden kann, ohne Rücksicht auf deren Erweiterung:

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

Daher müssen Sie in Debian / Ubuntu möglicherweise zuerst herausfinden, wo sich die Site-Konfiguration befindet.

  • Mit dem folgenden Befehl können Sie eine Liste aller verfügbaren Sites abrufen, indem Sie find(1)nach allen regulären Dateien suchen, die der angegebenen Maske entsprechen:

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

  • Mit dem folgenden Befehl können Sie eine Liste aller aktivierten Sites abrufen:

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

So deaktivieren / aktivieren Sie Sites unter Debian / Ubuntu:

  • So deaktivieren Sie eine Site: Wenn sich die Konfiguration in befindet conf.d, benennen Sie die Datei einfach so um, dass sie kein .confSuffix mehr hat . oder wenn Sie sites-enableddrin sind, bewegen Sie es raus sites-enabled.

  • Um eine Site zu aktivieren , ist es am besten, sie zu verschieben /etc/nginx/conf.dund in ein .confSuffix umzubenennen .

PS Warum halte ich Debians für include /etc/nginx/sites-enabled/*;böse? Versuchen Sie, einige Dateien in diesem Verzeichnis zu bearbeiten, und lassen Sie emacsdie Sicherungsdateien (mit dem ~Suffix) erstellen. Fragen Sie mich dann erneut.

cnst
quelle
4
Ich möchte darauf hinweisen, dass das Problem mit dieser Antwort in zwei irrtümlichen Annahmen in Bezug auf Debian und Derivate liegt: 1) Der Zweck des conf.dVerzeichnisses ist die serverweite Konfiguration für Module, Plugins, Fastcgi-Handler usw. und ausdrücklich , Host nicht zu speichern / vhost-Konfigurationen in und 2) Man sollte keine Dateien in sites-enabled serverfault.com/a/825297/86189
Bojan Markovic
@BojanMarkovic, du liegst falsch. Sie können keine serverweiten Konfigurationen bereitstellen conf.d, da diese im selben Kontext wie der Kontext mit sites-enabledeiner httpEbene enthalten sind. Daher gelten die Anweisungen für Module und Plugins möglicherweise nicht. Ebenso ist Ihre Annahme, dass man keine Dateien bearbeiten sollte, sites-enablednur ein Wunschdenken - es gibt keine solchen Anweisungen in der Distribution oder im Verzeichnis, also ist es nur Ihre Annahme, die in keiner Weise von der Distribution durchgesetzt wird, also Sie Es treten alle möglichen Probleme auf, z . B. stackoverflow.com/q/45852224/1122270 .
5.
Das Problem, auf das Sie hingewiesen haben, hat absolut keinen Zusammenhang damit. Ich irre mich conf.d, was wahrscheinlich den Debian-Betreuer von Nginx betrifft (oder es wird möglicherweise aus Gründen der Kompatibilität mit dem Upstream beibehalten). sites-enabledEs geht nicht darum, Dateien zu bearbeiten , sondern um den vermeintlichen Workflow unter Apache, den sie auf Nginx emulieren wollten. In Apache ist es aufgrund der Existenz von a2ensiteund a2dissiteSkripten ziemlich offensichtlich . Leider wird für Nginx nichts dergleichen bereitgestellt, was zeigt, wie niedrig die Wartungsqualität dieses Pakets unter Debian ist. Beiden fehlt die Dokumentation, stimmt.
Bojan Markovic
2
..Ich gebe dir das (docs fehlen in dieser Hinsicht furchtbar). Sie sind jedoch die erste Person, die Webserver unter Debian ausführt, mit der ich gesprochen habe, was dadurch verwirrt war. Nur eine einfache ls -al sites-enabledin Apache oder Nginx zeigt, dass die vorhandenen Dateien im Verzeichnis symbolische Links von sind -available, ebenso für Module unter Apache, zusammen mit zur Verfügung gestellten a2enmod/ a2dismodscirpts.
Bojan Markovic
1
@pzrq, Sie setzen viele Dinge gleich, die nichts miteinander zu tun haben. das available / enabled hat nichts mit apache oder debian zu tun; Wenn es keine gegenteiligen Beweise gibt, ist es im Grunde nur etwas, was sich ein Betreuer zur richtigen Zeit an den richtigen Ort geschlichen hat, als niemand hinschaute, und es blieb hängen. Es gibt kaum einen Grund, ihn weiter zu verwenden, wenn Sie bereits die Ressourcen für den Übergang zu nginx aufwenden, was beispielsweise bereits Konfigurationsänderungen erforderlich machen würde, um .htaccess zu entfernen. Dies könnte Ihre Konfiguration auch unter Berücksichtigung aller Clouds und Distributionen standardisieren , was mit conf.das-is recht einfach ist.
6.
1

Eine andere Methode besteht darin, die Konfigurationsdatei der Site in etwas umzubenennen, das ohne .conf endet

Z.B sudo mv mysite.conf mysite.conf.disabled

Laden Sie dann nginx neu, und dieser vhost wird auf die Standardeinstellung zurückgesetzt.

Pyrit
quelle
Es ist immer schön, den Befehl nginx_modsite zu verwenden. Sie können eine aktivierte Site viel einfacher und schneller auflisten, deaktivieren und umbenennen, als die Datei jedes Mal umzubenennen, wenn @Pyrite
Ghassen Telmoudi
3
@Pyrite Auf Ubuntu 14.04 spielt die Erweiterung keine Rolle, da nginx.conf sites-enabled enthält, da include /etc/nginx/sites-enabled/*;es nur conf dir as enthält*.conf
Bojan Markovic
2
@GhassenTelmoudi als das Skript, das Sie immer wieder erwähnen, ist ein Skript eines Drittanbieters, das nicht einmal von den Erstellern (Ubuntu) in das nginx-Paket gepackt wurde. In Ihrem Kommentar wird empfohlen, ein Skript eines Drittanbieters über eine (einzeilige) Befehlszeilenalternative zu verwenden. Auf diese Weise entstehen Sicherheitslücken und unnötig komplexe Abhängigkeitsbäume.
Scones
1
@cnst Ich würde nicht so weit gehen, es böse zu nennen, insbesondere ihre Wahl sites-availableund sites-enabledwie sie Verdienste und Nutzen haben. Jemand sollte wahrscheinlich nur einen Fehlerbericht für die wirklich beleidigende Zeile in nginx conf einreichen /etc/nginx/sites-enabled/*.conf;und sie werden es wahrscheinlich, da es wahrscheinlich ein Versehen ist. Aber wenn Sie den Debian-Workflow sites-availablerespektieren, werden Sie trotzdem Dateien bearbeiten und die verknüpfen, für die Sie die Aktivierung wünschen sites-enabled.
Bojan Markovic
1
@cnst Das Warum ist doch selbstverständlich, oder? Hiermit können Sie vhosts aktivieren und deaktivieren, ohne sie zu löschen, und zwar auf eine Weise, die sowohl für Apache als auch für Nginx identisch ist . Die Tatsache, dass Sie ausschließlich an nginx interessiert sind, beeinträchtigt nicht die Absicht der Debian-Betreuer, die gleiche Aktivierungs- / Deaktivierungsmethode für beide Webserver bereitzustellen.
Bojan Markovic