Nginx habilita el comando del sitio

131

Todos sabemos cómo habilitar un sitio web usando apache en linux. Estoy bastante seguro de que todos estamos de acuerdo en usar el comando a2ensite.

Desafortunadamente, no hay un comando equivalente predeterminado que viene con Nginx, pero sucedió que instalé algún paquete en ubuntu que me permitió habilitar / deshabilitar sitios y enumerarlos.

El problema es que no recuerdo el nombre de este paquete.

Alguien sabe de lo que estoy hablando?

Dime el nombre de este paquete y el nombre del comando.

Ghassen Telmoudi
fuente
55
La afirmación sobre a2ensite no es cierta para CentOS
user9517

Respuestas:

166

Si ha instalado el nginxpaquete desde los repositorios de Ubuntu, tendrá dos directorios.

/etc/nginx/sites-enabledy /etc/nginx/sites-available.

En la configuración principal de nginx /etc/nginx/nginx.conf, tiene la siguiente línea:

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

Básicamente, para enumerar todos los hosts virtuales disponibles, puede ejecutar el siguiente comando:

ls /etc/nginx/sites-available

Para activar uno de ellos, ejecute el siguiente comando:

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

Los scripts que vienen con Apache son básicamente simples envoltorios de shell que hacen algo similar a lo anterior.

Después de vincular los archivos, recuerde ejecutar sudo service nginx reload/service nginx reload

pkhamre
fuente
55
Sí, sé cómo hacerlo usando la línea de comando, gracias
Ghassen Telmoudi
23
Entonces no estoy seguro de lo que realmente está pidiendo.
pkhamre
3
recuerde recargar el servidor nginx con: sudo service nginx reload
Ricardo Martins
16
@pkhamre: Al usar Apache, hay dos scripts: a2ensite y a2dissite. Simplemente crean y eliminan los enlaces simbólicos que usted describe, por lo que son formas más rápidas de habilitar y deshabilitar.
Mads Skjern
66
Gracias por los constantes votos a favor de esta vieja respuesta. Si OP aceptara esta respuesta, sería épico :)
pkhamre
69

Simplemente cree este script /usr/bin/nginx_modsitey hágalo ejecutable.

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

Cómo funciona:

Para enumerar todos los sitios

$ sudo nginx_modsite -l

Para habilitar el sitio "test_website"

$ sudo nginx_modsite -e test_website

Para deshabilitar el sitio "test_website"

$ sudo nginx_modsite -d test_website
Ghassen Telmoudi
fuente
en la función ngx_relaod, comenté la lectura y simplemente hice reload = "y" ya que ejecuté esto a través de cron y no quería el aviso en absoluto. ¡Gracias!
radtek el
Sí, tiene todo el sentido, ¿puedes decirme dónde hiciste el cambio?
Ghassen Telmoudi
10
Un script bastante grande para ajustar algunos comandos estándar de una línea.
tobltobs
1
@tobltobs Los buenos programadores escriben código, los grandes programadores roban código :) Esto hace un buen agregado a mi colección de scripts de imágenes del servidor.
rdev5
55
@GhassenTelmoudi ya que el script que sigue mencionando es un script de terceros, que ni siquiera los creadores (ubuntu) empaquetan en el paquete nginx, su comentario sugiere utilizar un script de terceros sobre una alternativa de línea de comando (una línea). Así es como se crean las vulnerabilidades de seguridad y los árboles de dependencia innecesariamente complejos
bollos
32

¿Te refieres a nginx_ensitey nginx_dissite?

Michael Hampton
fuente
16
Esto es apenas una respuesta, ¿verdad? Estos comandos no están presentes en mi instalación de nginx, en Ubuntu instalado con apt-get. Parece que es solo un script de terceros: github.com/perusio/nginx_ensite
Mads Skjern
55
@MadsSkjern Si esto es "apenas una respuesta", ¡entonces la respuesta aceptada tampoco es muy buena!
Michael Hampton
3
En primer lugar, gracias por responder :) Y perdón por mi comentario, que tal vez suene ofensivo, cuando en realidad solo quería señalar que no fue muy útil para mí (en ese momento), debido a que suponía demasiado del lector.
Mads Skjern
25
Respondiste con dos comandos y una url, e incluso en forma de pregunta. Como alguien con mi bajo nivel de experiencia, su respuesta me habría enviado a buscar en Google. Tal vez encontraría una guía / tutorial / demostración útil en 2 minutos, tal vez estaría mirando alrededor durante una hora y todavía estaría confundido. Lo que me habría ayudado en aquel entonces era: "Existen estas herramientas nginx_ensite y nginx_dissite, es un script de terceros, descárguelo desde aquí y funcionan de esta manera, ejemplo, ejemplo". La respuesta de Ghassen es más elaborada, más introductoria, más útil. Espero que entiendas lo que quiero decir :)
Mads Skjern
8
@MadsSkjern Bueno, podrías haber hecho clic en el enlace. :)
Michael Hampton
4

NGINX

Si está utilizando uno de los paquetes oficiales de nginx de http://nginx.org/packages/ , la mejor manera es navegar al /etc/nginx/conf.ddirectorio y cambiar el nombre del archivo afectado de tener un .confsufijo a tener uno diferente para deshabilitar el sitio:

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

O lo contrario para habilitarlo:

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

Esto se debe a que el valor predeterminado /etc/nginx/nginx.conftiene la siguiente includedirectiva:

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

Debian / Ubuntu

Sin embargo, si está utilizando un derivado de Debian / Ubuntu, entonces, además de conf.d, también puede tener el mal no estándarsites-available y sites-enableddirectorios, algunos archivos bajo los cuales pueden incluirse descuidadamente sin importar su extensión:

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

Como tal, en Debian / Ubuntu, es posible que primero tenga que averiguar dónde se encuentra la configuración del sitio.

  • Puede usar el siguiente comando para obtener una lista de todos los sitios disponibles ejecutando find(1)para encontrar todos los archivos normales que coinciden con la máscara dada:

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

  • Puede usar el siguiente comando para obtener una lista de todos los sitios habilitados :

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

Luego, para deshabilitar / habilitar sitios en Debian / Ubuntu:

  • Para deshabilitar un sitio: si la configuración está activa conf.d, simplemente cambie el nombre del archivo para que ya no tenga un .confsufijo; o si está adentro sites-enabled, muévalo fuera sites-enabled.

  • Para habilitar un sitio, la mejor manera sería moverlo /etc/nginx/conf.dy cambiarle el nombre para tener un .confsufijo.

PD: ¿Por qué creo que Debian include /etc/nginx/sites-enabled/*;es malo? Intente editar un par de archivos en ese directorio y haga que emacscree los archivos de respaldo (con el ~sufijo), luego pregúnteme nuevamente.

cnst
fuente
44
Me gustaría señalar que el problema con esta respuesta radica en dos suposiciones erróneas con respecto a Debian y derivados: 1) El propósito del conf.ddirectorio es la configuración de todo el servidor para módulos, complementos, controladores fastcgi, etc. y explícitamente no almacenar host / configuraciones de vhost en y 2) Uno no debe editar ningún archivo en sites-enabled serverfault.com/a/825297/86189
Bojan Markovic
@BojanMarkovic, estás equivocado. No puede servir configuraciones en todo el servidor conf.d, ya que está incluido en el mismo contexto que el contexto de sites-enabledun httpnivel, por lo tanto, las directivas de módulos y complementos pueden no aplicarse. Del mismo modo, su suposición de que uno no debería editar archivos sites-enabledes simplemente una ilusión: no hay tales instrucciones dentro de la distribución o dentro del directorio, por lo tanto, es puramente su suposición, que de ninguna manera se aplica por la distribución, por lo tanto, usted tiene todo tipo de problemas que surgen de él, por ejemplo, stackoverflow.com/q/45852224/1122270 .
cnst
El problema que señaló no tiene absolutamente ninguna conexión con esto. Me equivoco, conf.dya que es, probablemente, el mantenedor de Debian de Nginx (o tal vez se mantiene por compatibilidad con upstream). Acerca de no editar archivos sites-enabled, no es una ilusión, sino el supuesto flujo de trabajo bajo Apache que intentaron emular en Nginx. En Apache es bastante obvio debido a la existencia de a2ensitey a2dissiteguiones. Desafortunadamente, nada de eso se proporciona para Nginx, lo que muestra cuán baja es la calidad de mantenimiento de ese paquete en Debian. Ambos carecen de documentación, cierto.
Bojan Markovic
2
.. Te lo daré (faltan documentos a este respecto). Sin embargo, usted es la primera persona que ejecuta servidores web en Debian con los que he hablado y que estaba confundido por esto. Solo un simple ls -al sites-enableden Apache o Nginx muestra que los archivos existentes en el directorio son enlaces simbólicos -available, lo mismo para los módulos en Apache, junto con a2enmod/ a2dismodscirpts proporcionados .
Bojan Markovic
1
@pzrq, estás equiparando muchas cosas no relacionadas; lo disponible / habilitado no tiene nada que ver con apache ni debian; fallando evidencia de lo contrario, es básicamente algo que un responsable de mantenimiento se coló en el lugar correcto en el momento correcto cuando nadie estaba mirando, y se quedó; hay pocas razones para seguir usándolo si ya está gastando los recursos para la transición a nginx, lo que ya requeriría reescrituras de configuración para deshacerse de .htaccess, por ejemplo, también podría estandarizar su configuración con todas las nubes y distribuciones en mente , que es bastante fácil con conf.del estado actual.
cnst
1

Otro método es simplemente cambiar el nombre del archivo de configuración del sitio a algo que termine sin .conf

P.ej sudo mv mysite.conf mysite.conf.disabled

Luego vuelva a cargar nginx, y ese vhost volverá al valor predeterminado.

Pirita
fuente
siempre es bueno usar el comando nginx_modsite, puede enumerar, deshabilitar, habilitar el sitio mucho más fácil y rápido, que renombrar el archivo cada vez que @Pyrite
Ghassen Telmoudi
3
@Pyrite En Ubuntu 14.04 la extensión no importa ya que nginx.conf incluye sitios habilitados ya include /etc/nginx/sites-enabled/*;que solo incluye conf dir como*.conf
Bojan Markovic
2
@GhassenTelmoudi ya que el script que sigue mencionando es un script de terceros, que ni siquiera los creadores (ubuntu) empaquetan en el paquete nginx, su comentario sugiere utilizar un script de terceros sobre una alternativa de línea de comando (una línea). Así es como se crean las vulnerabilidades de seguridad y los árboles de dependencia innecesariamente complejos.
bollos
1
@cnst No iría tan lejos como llamarlo malvado, especialmente su elección sites-availabley sites-enabledsu mérito y uso. Alguien probablemente debería simplemente presentar un informe de error para la verdadera línea ofensiva en nginx conf /etc/nginx/sites-enabled/*.conf;y probablemente lo hará, ya que probablemente sea un descuido. Pero si respetas el flujo de trabajo de Debian, estarás editando archivos de sites-availabletodos modos y simulando los que deseas habilitar sites-enabled.
Bojan Markovic
1
@cnst ¿ Por qué es bastante evidente, no? Le permite habilitar y deshabilitar vhosts sin eliminarlos, de manera idéntica tanto en apache como en nginx. El hecho de que esté exclusivamente interesado en nginx no invalida la intención de los mantenedores de Debian de proporcionar un método de habilitación / deshabilitación similar para ambos servidores web.
Bojan Markovic