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

당신이 지적한 문제는 이것과 전혀 관련이 없습니다. 나는 conf.d아마도 Nginx의 데비안 관리자 (또는 아마도 업스트림과의 호환성을 위해 유지)에 대해 잘못 되었습니다. 에서 파일을 편집 sites-enabled하지 않는 것에 관해서는 아파치에서 Nginx를 모방하려고 시도한 웜 흐름이 바람직하지 않습니다. 아파치에서는 존재 a2ensite와 a2dissite스크립트 로 인해 매우 분명 합니다. 불행히도 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-available과 sites-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.