Nginx 사이트 활성화 명령


131

우리 모두는 리눅스에서 아파치를 사용하여 웹 사이트를 활성화하는 방법을 알고 있습니다. 우리 모두 a2ensite 명령 사용에 동의한다고 확신합니다.

불행히도 Nginx에는 기본적으로 동등한 명령이 없지만 우분투에 일부 패키지를 설치하여 사이트를 활성화 / 비활성화하고 나열 할 수있었습니다.

문제는이 패키지의 이름을 기억하지 못한다는 것입니다.

내가 무슨 말을하는지 아는 사람 있나요?

이 패키지의 이름과 명령 이름을 알려주십시오.


5
a2ensite에 대한 주장에 CentOS에 대한 사실이 아니다
user9517

답변:


166

nginxUbuntu 리포지토리에서 패키지를 설치 한 경우 두 개의 디렉토리가 있습니다.

/etc/nginx/sites-enabled그리고 /etc/nginx/sites-available.

기본 nginx 구성 /etc/nginx/nginx.conf에는 다음 줄이 있습니다.

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

따라서 기본적으로 사용 가능한 모든 가상 호스트를 나열하려면 다음 명령을 실행할 수 있습니다.

ls /etc/nginx/sites-available

이들 중 하나를 활성화하려면 다음 명령을 실행하십시오.

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

Apache와 함께 제공되는 스크립트는 기본적으로 위와 유사한 간단한 쉘 래퍼입니다.

파일을 연결 한 후 sudo service nginx reload/ 를 실행해야합니다.service nginx reload


5
그래, 나도 알아 방법이 명령 줄, 감사 사용
Ghassen Telmoudi

23
그렇다면 나는 당신이 정말로 원하는 것을 확신하지 못합니다.
pkhamre

3
sudo service nginx reload
Ricardo Martins

16
@pkhamre : Apache를 사용할 때 a2ensite와 a2dissite의 두 가지 스크립트가 있습니다. 사용자가 설명하는 심볼릭 링크를 생성 및 삭제하기 때문에 더 빠르게 활성화 및 비활성화 할 수 있습니다.
Mads Skjern

6
이 오래된 답변에 대한 지속적인지지에 감사드립니다. 영업 이익이 응답을 받아들이는 경우는 서사시 :)이 될 것입니다
pkhamre

69

이 스크립트 /usr/bin/nginx_modsite를 작성하고 실행 가능하게 만드십시오.

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

작동 방식 :

모든 사이트를 나열하려면

$ sudo nginx_modsite -l

"test_website"사이트를 활성화하려면

$ sudo nginx_modsite -e test_website

"test_website"사이트를 비활성화하려면

$ sudo nginx_modsite -d test_website

ngx_relaod 함수에서 cron을 통해이를 실행하고 프롬프트를 원하지 않기 때문에 읽기에 주석을 달고 reload = "y"를 만듭니다. 감사!
radtek

네, 완벽하게 이해됩니다. 어디에서 변경을했는지 말씀해 주시겠습니까?
Ghassen Telmoudi 2011

10
표준 한 줄 명령을 감싸는 꽤 큰 스크립트입니다.
tobltobs

1
@tobltobs 훌륭한 프로그래머는 코드를 작성하고 훌륭한 프로그래머는 코드를 훔칩니다. 이것은 서버 이미징 스크립트 모음에 추가됩니다.
rdev5

5
@GhassenTelmoudi는 언급 한 스크립트가 타사 스크립트이며 작성자 (우분투)가 nginx 패키지로 패키지화하지 않았으므로 의견은 (한 줄) 명령 줄 대안을 통해 타사 스크립트를 사용하는 것이 좋습니다. 이 보안 취약점 및 불필요하게 복잡한 의존성 나무가 만들어지는 방법입니다
스콘

32

당신을 언급 nginx_ensite하고 nginx_dissite있습니까?


16
이것은 거의 답이 아닙니다. 이 명령은 apt-get으로 설치된 Ubuntu의 nginx 설치에 없습니다. : 그냥 제 3 자 스크립트 것 같다 github.com/perusio/nginx_ensite
MADS Skjern

5
@MadsSkjern 이것이 "거의 답"이라면 받아 들여진 대답은 그다지 중요하지 않습니다!
Michael Hampton

3
우선, 답변 주셔서 감사합니다 :) 그리고 내 의견에 대해 유감스럽게 생각합니다. 아마도 불쾌하게 들립니다. 리더.
Mads Skjern

25
당신은 두 가지 명령과 URL로, 심지어 질문의 형태로 대답했습니다. 내 경험이 낮은 사람으로서 당신의 대답은 저를 인터넷으로 보내주었습니다. 어쩌면 2 분 안에 유용한 가이드 / 튜토리얼 / 데모를 찾을 수 있습니다. 아마도 1 시간 동안 둘러보고 혼란 스러울 것입니다. 당시에 도움이 된 것은 : "이 도구 nginx_ensite 및 nginx_dissite가 있습니다. 타사 스크립트이므로 여기에서 다운로드하여 예를 들어이 방식으로 작동합니다." Ghassen의 답변은 더 정교하고 입문 적이며 도움이됩니다. 나는 당신이 무슨 뜻인지 이해하기를 바랍니다 :)
Mads Skjern

8
@MadsSkjern 글쎄, 당신은 링크를 클릭했을 수 있습니다. :)
Michael Hampton

4

NGINX

당신이 사용하는 경우 의 nginx의 공식 상류 패키지 중 하나를 에서 http://nginx.org/packages/ , 가장 좋은 방법은로 이동하는 것입니다 /etc/nginx/conf.d않아도 영향을받는 파일을 디렉토리 및 이름 변경 .conf에 다른 하나를 데 접미사 사이트를 비활성화하십시오.

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

또는 그것을 가능하게하는 반대 :

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

기본값 /etc/nginx/nginx.conf에는 다음 include지시문 이 있기 때문입니다 .

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

데비안 / 우분투

그러나 데비안 / 우분투 파생어를 사용하는 경우,에 추가 conf.d하여 악의적 인 비표준sites-availablesites-enabled디렉토리가있을 수 있습니다. 일부 파일은 확장명에 관계없이 느리게 포함될 수 있습니다.

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

따라서 데비안 / 우분투에서는 먼저 사이트 설정이 어디에 있는지 알아야합니다.

  • 다음 명령을 사용 하여 지정된 마스크와 일치하는 모든 일반 파일을 찾도록 실행 하여 사용 가능한 모든 사이트 목록을 얻을 있습니다 find(1).

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

  • 다음 명령을 사용하여 모든 활성화 된 사이트 목록을 얻을 있습니다.

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

그런 다음 데비안 / 우분투에서 사이트를 비활성화 / 활성화하려면 :

  • 사이트 를 비활성화 하려면 : 설정이에 있는 경우 conf.d파일 이름을 더 이상 .conf접미사 가 없도록 이름을 바꿉니다 . 또는에 있으면을 sites-enabled밖으로 옮기십시오 sites-enabled.

  • 사이트 를 활성화 하려면 사이트를로 이동 /etc/nginx/conf.d하고 이름을 .conf접미사로 바꾸는 것이 가장 좋습니다 .

추신 왜 데비안 include /etc/nginx/sites-enabled/*;이 사악 하다고 생각 합니까? 해당 디렉토리에서 몇 개의 파일을 편집 emacs하고 백업 파일 ( ~접미사 포함)을 작성한 후 다시 요청하십시오.


4
이 답변의 문제는 데비안과 파생물에 관한 두 가지 잘못된 가정에 있다고 지적하고 싶습니다 .1) conf.d디렉토리 의 목적은 모듈, 플러그인, fastcgi 핸들러 등의 서버 전체 구성이며 명시 적으로 호스트를 저장 하지 않습니다 / 2) 하나와의 가상 호스트 설정 하지 말아야 의 모든 파일을 편집 sites-enabled serverfault.com/a/825297/86189
보얀 마코 빅

@BojanMarkovic, 당신은 틀 렸습니다. 서버 수준 구성 conf.dsites-enabled단일 http수준 컨텍스트 와 동일한 컨텍스트에 포함되어 있으므로 모듈 및 플러그인 지시문이 적용되지 않을 수 있으므로 서버 전체 구성을 제공 할 수 없습니다. 마찬가지로, 파일을 편집해서는 안된다는 가정 sites-enabled은 단지 희망적인 생각입니다. 배포판이나 디렉토리 내에 그러한 지침이 없기 때문에, 그것은 배포에 의해 시행되지 않는 순수한 가정입니다. stackoverflow.com/q/45852224/1122270 와 같이 모든 종류의 문제가 발생합니다 .
cnst

당신이 지적한 문제는 이것과 전혀 관련이 없습니다. 나는 conf.d아마도 Nginx의 데비안 관리자 (또는 아마도 업스트림과의 호환성을 위해 유지)에 대해 잘못 되었습니다. 에서 파일을 편집 sites-enabled하지 않는 것에 관해서는 아파치에서 Nginx를 모방하려고 시도한 웜 흐름이 바람직하지 않습니다. 아파치에서는 존재 a2ensitea2dissite스크립트 로 인해 매우 분명 합니다. 불행히도 Nginx에는 데비안에서 해당 패키지의 유지 관리 품질이 얼마나 낮은지를 보여주는 종류가 없습니다. 둘 다 문서화가 부족하다.
보얀 마르코비치

2
.. 나는 당신에게 줄 것이다 (문서는 이와 관련하여 부족하다). 그러나 당신은 데비안에서 웹 서버를 운영하는 첫 번째 사람입니다. ls -al sites-enabledApache 또는 Nginx에서 간단한 것은 디렉토리의 기존 파일 -available이 제공된 a2enmod/ a2dismodscirpts 와 함께 Apache의 모듈에 대한 심볼릭 링크 인 것을 보여줍니다 .
보얀 마르코비치

1
@pzrq, 당신은 많은 관련없는 것들을 동일시하고 있습니다; 사용 가능 / 사용 가능은 아파치 나 데비안과 관련이 없습니다. 반대로 증거에 실패하는 것은 기본적으로 일부 관리자가 아무도 보지 않았을 때 적시에 적절한 장소에 몰래 들어간 것입니다. nginx로 전환하는 데 이미 리소스를 소비하고 있다면 .htaccess를 제거하기 위해 구성을 다시 작성해야하는 경우에도 계속 사용할 이유가 거의 없습니다. 예를 들어 모든 클라우드 및 배포판을 고려하여 구성을 표준화 할 수도 있습니다. ,있는 그대로 쉽게 사용할 수 conf.d있습니다.
cnst

1

또 다른 방법은 사이트의 구성 파일 이름을 .conf없이 끝나는 이름으로 바꾸는 것입니다.

예 : sudo mv mysite.conf mysite.conf.disabled

그런 다음 nginx를 다시로드하면 해당 호스트가 기본값으로 돌아갑니다.


항상 nginx_modsite 명령을 사용하는 것이 좋으며, 매번 파일 이름을 바꿀 때마다 @Pyrite
Ghassen Telmoudi

3
@Pyrite Ubuntu 14.04에서는 확장명이 작동하지 않습니다. nginx.conf include /etc/nginx/sites-enabled/*;에는 conf 디렉토리 만 포함되어 있기 때문에 nginx.conf에 사이트가 활성화되어 있습니다.*.conf
Bojan Markovic

2
@GhassenTelmoudi는 언급 한 스크립트가 타사 스크립트이며 작성자 (우분투)가 nginx 패키지로 패키지화하지 않았으므로 의견은 (한 줄) 명령 줄 대안을 통해 타사 스크립트를 사용하는 것이 좋습니다. 이것이 보안 취약점과 불필요하게 복잡한 종속성 트리가 생성되는 방식입니다.
스콘

1
@cnst 나는 그것을 악이라고 부르지 않는 한, 특히 그들의 선택 sites-availablesites-enabled장점과 사용을 갖는 한 가지 않을 것이다. 누군가는 아마도 nginx conf의 실제 공격 라인에 대한 버그 보고서를 제출해야하며 아마도 /etc/nginx/sites-enabled/*.conf;감독 일 것입니다. 그러나 데비안 워크 플로를 존중한다면 sites-available어쨌든 파일을 편집 하고 활성화하려는 파일을 심볼릭 링크 할 것 sites-enabled입니다.
Bojan Markovic

1
@cnst 자명 한가 ? 아파치와 nginx에서 동일한 방식으로 호스트를 삭제하지 않고 활성화 및 비활성화 할 수 있습니다 . 사실 두 웹 서버에 대한 유사한 가능 / 비활성화 방법을 제공하는 데비안 메인테이너 '의도를 무효화하지 않습니다 nginx를 독점적으로 관심이 있습니다.
Bojan Markovic
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.