Comando Nginx enable site

131

Todos sabemos como habilitar um site usando o apache no linux. Tenho certeza de que todos concordamos em usar o comando a2ensite.

Infelizmente, não existe um comando equivalente padrão no Nginx, mas aconteceu que eu instalei algum pacote no ubuntu que me permitiu ativar / desativar sites e listá-los.

O problema é que não me lembro do nome deste pacote.

Alguém sabe do que estou falando?

Por favor, diga-me o nome deste pacote e o nome do comando.

Ghassen Telmoudi
fonte
5
A asserção sobre o a2ensite não é verdadeira para o CentOS
#

Respostas:

166

Se você instalou o nginxpacote a partir dos repositórios do Ubuntu, terá dois diretórios.

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

Na configuração principal do nginx /etc/nginx/nginx.conf, você tem a seguinte linha:

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

Então, basicamente, para listar todos os virtualhosts disponíveis, você pode executar o seguinte comando:

ls /etc/nginx/sites-available

Para ativar um deles, execute o seguinte comando:

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

Os scripts que acompanham o Apache são basicamente simples invólucros de shell que fazem algo semelhante ao acima.

Depois de vincular os arquivos, lembre-se de executar sudo service nginx reload/service nginx reload

pkhamre
fonte
5
Sim, eu sei como que o uso da linha de comando, graças
Ghassen Telmoudi
23
Então, não tenho certeza do que você realmente está pedindo.
pkhamre 5/09/12
3
lembre-se de recarregar servidor nginx com: sudo recarga nginx serviço
Ricardo Martins
16
@pkhamre: Ao usar o Apache, existem dois scripts: a2ensite e a2dissite. Eles simplesmente criam e excluem os links simbólicos que você descreve, portanto, são maneiras mais rápidas de ativar e desativar.
Mads Skjern
6
Obrigado pelas constantes votações nesta resposta antiga. Se OP iria aceitar essa resposta seria :) épica
pkhamre
69

Basta criar esse script /usr/bin/nginx_modsitee torná-lo executável.

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

Como funciona:

Para listar todos os sites

$ sudo nginx_modsite -l

Para habilitar o site "test_website"

$ sudo nginx_modsite -e test_website

Para desativar o site "test_website"

$ sudo nginx_modsite -d test_website
Ghassen Telmoudi
fonte
na função ngx_relaod, comentei a leitura e apenas fiz reload = "y", pois eu executei isso através do cron e não queria o prompt. Obrigado!
Radtek
sim, faz todo o sentido, você pode me dizer onde você fez a mudança?
Ghassen Telmoudi 5/11
10
Um script bastante grande para envolver alguns comandos padrão de uma linha.
tobltobs
1
@tobltobs Bons programadores escrevem código, grandes programadores roubam código :) Isso faz uma boa adição à minha coleção de scripts de criação de imagens de servidor.
Rdev5
5
@GhassenTelmoudi como o script que você menciona é um script de terceiros, que nem é empacotado pelos criadores (ubuntu) no pacote nginx, seu comentário sugere usar um script de terceiros em uma alternativa de linha de comando (uma linha). Isto é como as vulnerabilidades de segurança e árvores de dependência desnecessariamente complexos são criados
scones
32

Você está se referindo a nginx_ensitee nginx_dissite?

Michael Hampton
fonte
16
Isso é apenas uma resposta, não é? Esses comandos não estão presentes na minha instalação do nginx, no Ubuntu instalado com o apt-get. Parece que é apenas um script de terceiros: github.com/perusio/nginx_ensite
Mads Skjern
5
@MadsSkjern Se isso é "apenas uma resposta", a resposta aceita também não é grande!
Michael Hampton
3
Antes de tudo, obrigado por responder :) E desculpe-me pelo meu comentário, que talvez pareça ofensivo, quando na verdade eu só queria ressaltar que não era muito útil para mim (na época), por assumir muito do leitor.
precisa
25
Você respondeu com dois comandos e um URL, e mesmo na forma de uma pergunta. Como alguém com meu baixo nível de experiência, sua resposta teria me enviado para o Google. Talvez eu ache um guia / tutorial / demonstração útil em 2 minutos, talvez esteja procurando uma hora e ainda esteja confuso. O que teria me ajudado na época era: "Existem essas ferramentas nginx_ensite e nginx_dissite, é um script de terceiros, faça o download daqui e elas funcionam desta maneira, exemplo, exemplo". A resposta de Ghassen é mais elaborada, mais introdutória, mais útil. Espero que você entenda o que quero dizer :)
Mads Skjern
8
@MadsSkjern Bem, você poderia apenas clicar no link. :)
Michael Hampton
4

NGINX

Se você estiver usando um dos pacotes oficiais do upstream do nginx em http://nginx.org/packages/ , a melhor maneira é navegar para o /etc/nginx/conf.ddiretório e renomear o arquivo afetado de ter um .confsufixo para outro. desativar o site:

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

Ou o oposto para habilitá-lo:

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

Isso ocorre porque o padrão /etc/nginx/nginx.conftem a seguinte includediretiva:

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

Debian / Ubuntu

No entanto, se você estiver usando um derivado Debian / Ubuntu, além de conf.d, também poderá ter os diretórios e padrões não padronizadossites-availablesites-enabled , alguns arquivos sob os quais podem ser incluídos desleixadamente, sem levar em consideração sua extensão:

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

Como tal, no Debian / Ubuntu, você pode primeiro ter que descobrir onde a configuração do site está localizada.

  • Você pode usar o comando a seguir para obter uma lista de todos os sites disponíveis executando find(1)para encontrar todos os arquivos regulares correspondentes à máscara especificada:

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

  • Você pode usar o seguinte comando para obter uma lista de todos os sites ativados :

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

Em seguida, para desativar / ativar sites no Debian / Ubuntu:

  • Para desativar um site: se a configuração estiver ativada conf.d, apenas renomeie o arquivo para não ter mais um .confsufixo; ou, se estiver dentro sites-enabled, remova-o sites-enabled.

  • Para habilitar um site, a melhor maneira seria movê-lo para /etc/nginx/conf.de renomear para ter um .confsufixo.

PS Por que eu acho que o Debian include /etc/nginx/sites-enabled/*;é mau? Tente editar alguns arquivos nesse diretório e faça com que você emacscrie os arquivos de backup (com o ~sufixo) e me pergunte novamente.

cnst
fonte
4
Eu gostaria de salientar que o problema com esta resposta está em duas suposições errôneas sobre o Debian e os derivados: 1) O objetivo do conf.ddiretório é a configuração em todo o servidor, como a de módulos, plugins, manipuladores fastcgi etc. e explicitamente para não armazenar o host configurações do / vhost em e 2) Não se deve editar nenhum arquivo em sites-enabled serverfault.com/a/825297/86189
Bojan Markovic
@BojanMarkovic, você está errado. Você não pode servir configurações em todo o servidor conf.d, porque elas estão incluídas no mesmo contexto que o contexto de sites-enabledum httpnível; portanto, as diretivas de módulo e plug-in podem não se aplicar. Da mesma forma, sua suposição de que não se deve editar arquivos sites-enabledé meramente uma ilusão - não existem instruções na distribuição ou no diretório; portanto, é puramente sua suposição, que não é de forma alguma imposta pela distribuição; portanto, você tem todos os tipos de problemas decorrentes dele, por exemplo, stackoverflow.com/q/45852224/1122270 .
CNST
O problema que você apontou não tem absolutamente nenhuma conexão com isso. Estou errado sobre o conf.dque é, provavelmente, o mantenedor do Nginx do Debian (ou talvez seja mantido para compatibilidade com o upstream). Sobre não editar arquivos sites-enabled, não é uma ilusão, mas o suposto worflow no Apache que eles tentaram emular no Nginx. No apache, é bastante óbvio devido à existência a2ensitee a2dissitescripts. Infelizmente nada do tipo é fornecido para o Nginx, que mostra quão baixa a qualidade de manutenção desse pacote está no Debian. Ambos não têm documentação, é verdade.
Bojan Markovic
2
..Eu vou lhe dar isso (os documentos são extremamente escassos a esse respeito). No entanto, você é a primeira pessoa que executa servidores da Web no Debian com quem conversei e que ficou confusa com isso. Apenas um simples ls -al sites-enabledno Apache ou Nginx mostra que os arquivos existentes no diretório são links simbólicos -available, idem para módulos no Apache, junto com os a2enmod/ a2dismodscirpts fornecidos .
Bojan Markovic
1
@pzrq, você está equiparando muitas coisas não relacionadas; o disponível / ativado não tem nada a ver com apache nem debian; na falta de evidência em contrário, é basicamente algo que algum mantenedor entrou no lugar certo, na hora certa, quando ninguém estava olhando, e ele ficou preso; há poucas razões para continuar usando-o se você já estiver gastando os recursos para fazer a transição para o nginx, o que já exigiria reescritas de configuração para se livrar do .htaccess, por exemplo - também pode padronizar sua configuração com todas as nuvens e distros em mente , o que é fácil o suficiente conf.dcomo está.
CNST
1

Outro método é apenas renomear o arquivo de configuração do site para algo que termine sem o .conf

Por exemplo sudo mv mysite.conf mysite.conf.disabled

Em seguida, recarregue o nginx e esse vhost retornará ao padrão.

Pirita
fonte
é sempre bom usar o comando nginx_modsite, você pode listar, desativar, local habilitado muito mais fácil e mais rápido, do que mudar o nome do arquivo de cada vez @Pyrite
Ghassen Telmoudi
3
@Pyrite No Ubuntu 14.04 a extensão não mater como nginx.conf inclui sites habilitados como include /etc/nginx/sites-enabled/*;ele só inclui conf dir como*.conf
Bojan Markovic
2
@GhassenTelmoudi como o script que você menciona é um script de terceiros, que nem é empacotado pelos criadores (ubuntu) no pacote nginx, seu comentário sugere usar um script de terceiros em uma alternativa de linha de comando (uma linha). É assim que as vulnerabilidades de segurança e as árvores de dependência desnecessariamente complexas são criadas.
scones
1
@ CNST Eu não iria tão longe como chamar isso de mal, especialmente a sua escolha sites-availablee sites-enabledcomo eles têm mérito e uso. Alguém provavelmente deveria apenas enviar um relatório de bug para a verdadeira linha ofensiva no nginx conf to /etc/nginx/sites-enabled/*.conf;e provavelmente o fará, pois provavelmente é uma supervisão. Mas se você respeitar o fluxo de trabalho do Debian, estará editando os arquivos de sites-availablequalquer maneira e simbolizando os que deseja ativar sites-enabled.
Bojan Markovic
1
@ CNST O por que é bastante evidente, não é? Ele permite ativar e desativar vhosts sem excluí-los, de maneira idêntica no apache e no nginx. O fato de você estar exclusivamente interessado no nginx não invalida a intenção dos mantenedores do Debian de fornecer o método similar de habilitar / desabilitar para os dois servidores web.
Bojan Markovic 5/09