Nginx kích hoạt lệnh trang web


131

Chúng ta đều biết cách kích hoạt một trang web bằng apache trên linux. Tôi khá chắc chắn rằng tất cả chúng ta đều đồng ý sử dụng lệnh a2ensite.

Thật không may, không có lệnh tương đương mặc định đi kèm với Nginx, nhưng thực tế là tôi đã cài đặt một số gói trên ubfox cho phép tôi bật / tắt các trang web và liệt kê chúng.

Vấn đề là tôi không nhớ tên của gói này.

Có ai biết tôi đang nói về cái gì không?

Xin vui lòng cho tôi biết tên của gói này và tên lệnh.


5
Khẳng định về a2ensite không đúng với CentOS
user9517

Câu trả lời:


166

Nếu bạn đã cài đặt nginxgói từ kho Ubuntu, bạn sẽ có hai thư mục.

/etc/nginx/sites-enabled/etc/nginx/sites-available.

Trong cấu hình nginx chính /etc/nginx/nginx.conf, bạn có dòng sau:

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

Vì vậy, về cơ bản để liệt kê tất cả các Virtualhost có sẵn, bạn có thể chạy lệnh sau:

ls /etc/nginx/sites-available

Để kích hoạt một trong số chúng, hãy chạy lệnh sau:

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

Các tập lệnh đi kèm với Apache về cơ bản chỉ là các trình bao bọc đơn giản thực hiện một cái gì đó tương tự như trên.

Sau khi liên kết các tệp, hãy nhớ chạy sudo service nginx reload/service nginx reload


5
Vâng, tôi biết cách sử dụng dòng lệnh đó, cảm ơn
Ghassen Telmoudi

23
Sau đó, tôi không chắc chắn những gì bạn đang thực sự yêu cầu.
pkhamre

3
nhớ tải lại máy chủ nginx bằng: dịch vụ sudo nginx tải lại
Ricardo Martins

16
@pkhamre: Khi sử dụng Apache có hai tập lệnh: a2ensite và a2dissite. Họ chỉ cần tạo và xóa các liên kết tượng trưng mà bạn mô tả, vì vậy chúng là cách nhanh hơn để bật và tắt.
Mads Skjern

6
Cảm ơn các upvote liên tục về câu trả lời cũ này. Nếu OP chấp nhận câu trả lời này thì nó sẽ tuyệt vời :)
pkhamre

69

Chỉ cần tạo tập lệnh này /usr/bin/nginx_modsitevà làm cho nó thực thi.

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

Làm thế nào nó hoạt động:

Để liệt kê tất cả các trang web

$ sudo nginx_modsite -l

Để kích hoạt trang web "test_website"

$ sudo nginx_modsite -e test_website

Để vô hiệu hóa trang web "test_website"

$ sudo nginx_modsite -d test_website

trong hàm ngx_relaod, tôi đã nhận xét việc đọc và chỉ thực hiện tải lại = "y" vì tôi chạy nó qua cron và không muốn nhắc nhở gì cả. Cảm ơn!
radtek

Vâng, nó có ý nghĩa hoàn hảo, bạn có thể cho tôi biết bạn đã thực hiện thay đổi ở đâu không?
Ghassen Telmoudi

10
Một tập lệnh khá lớn để bọc một số lệnh một dòng tiêu chuẩn.
tobltobs

1
@tobltobs Lập trình viên giỏi viết mã, lập trình viên tuyệt vời ăn cắp mã :) Điều này làm cho một bổ sung tốt đẹp vào bộ sưu tập các kịch bản hình ảnh máy chủ của tôi.
lần thứ

5
@GhassenTelmoudi vì tập lệnh mà bạn nhắc đến là tập lệnh của bên thứ ba, thậm chí không được người tạo (ub Ubuntu) đóng gói vào gói nginx, nhận xét của bạn đề nghị sử dụng tập lệnh của bên thứ ba thay thế cho dòng lệnh (một dòng). Đây là cách các lỗ hổng bảo mật và các cây phụ thuộc phức tạp không cần thiết được tạo ra
bánh nướng

32

Bạn đang đề cập đến nginx_ensitenginx_dissite?


16
Đây chỉ là một câu trả lời, phải không? Các lệnh này không có trong cài đặt nginx của tôi, trên Ubuntu được cài đặt với apt-get. Có vẻ như đó chỉ là kịch bản của bên thứ 3: github.com/perusio/nginx_ensite
Mads Skjern

5
@MadsSkjern Nếu đây là "hầu như không có câu trả lời" thì câu trả lời được chấp nhận cũng không phải là nhiều!
Michael Hampton

3
Trước hết, cảm ơn vì đã trả lời :) Và xin lỗi vì nhận xét của tôi, điều này có vẻ gây khó chịu, khi tôi thực sự chỉ muốn chỉ ra rằng nó không hữu ích cho tôi (vào thời điểm đó), vì nó cho rằng quá nhiều từ người đọc.
Mads Skjern

25
Bạn đã trả lời bằng hai lệnh và url, và thậm chí dưới dạng câu hỏi. Là một người có trình độ kinh nghiệm thấp của tôi, câu trả lời của bạn sẽ khiến tôi bị choáng váng. Có lẽ tôi sẽ tìm thấy một hướng dẫn / hướng dẫn / bản demo hữu ích trong 2 phút, có thể tôi sẽ tìm kiếm trong một giờ và vẫn còn bối rối. Điều có thể đã giúp tôi hồi đó là: "Có những công cụ nginx_ensite và nginx_dissite, đây là tập lệnh của bên thứ 3, tải xuống từ đây và ví dụ, chúng hoạt động theo cách này". Câu trả lời của Ghassen là công phu hơn, giới thiệu hơn, hữu ích hơn. Tôi hy vọng bạn hiểu ý của tôi :)
Mads Skjern

8
@MadsSkjern Vâng, bạn có thể chỉ cần nhấp vào liên kết. :)
Michael Hampton

4

NGINX

Nếu bạn đang sử dụng một trong các gói nginx chính thức từ http://nginx.org/packages/ , cách tốt nhất là điều hướng đến /etc/nginx/conf.dthư mục và đổi tên tệp bị ảnh hưởng từ có .confhậu tố thành một tệp khác vô hiệu hóa trang web:

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

Hoặc ngược lại để kích hoạt nó:

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

Điều này là do mặc định /etc/nginx/nginx.confincludechỉ thị sau :

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

Debian / Ubuntu

Tuy nhiên, nếu bạn đang sử dụng công cụ phái sinh Debian / Ubuntu, ngoài ra conf.d, bạn cũng có thể có các thư mục và tiêu chuẩn không chính xácsites-availablesites-enabled , một số tệp có thể được đưa vào một cách chậm chạp mà không liên quan đến tiện ích mở rộng của chúng:

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

Như vậy, trong Debian / Ubuntu, trước tiên bạn có thể phải tìm ra vị trí cấu hình trang web.

  • Bạn có thể sử dụng lệnh sau để nhận danh sách tất cả các trang web có sẵn bằng cách chạy find(1)để tìm tất cả các tệp thông thường khớp với mặt nạ đã cho:

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

  • Bạn có thể sử dụng lệnh sau để có danh sách tất cả các trang web được kích hoạt :

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

Sau đó, để vô hiệu hóa / kích hoạt các trang web trên Debian / Ubuntu:

  • Để vô hiệu hóa một trang web: nếu cấu hình được đặt vào conf.d, chỉ cần đổi tên tệp thành không còn .confhậu tố; hoặc nếu trong sites-enabled, di chuyển nó ra khỏi sites-enabled.

  • Để kích hoạt một trang web, cách tốt nhất là chuyển nó đến /etc/nginx/conf.dvà đổi tên thành .confhậu tố.

Tái bút: Tại sao tôi nghĩ Debian include /etc/nginx/sites-enabled/*;là xấu xa? Hãy thử chỉnh sửa một vài tệp trong thư mục đó và yêu cầu bạn emacstạo các tệp sao lưu (có ~hậu tố), sau đó hỏi lại tôi.


4
Tôi muốn chỉ ra rằng các vấn đề với câu trả lời này nằm trong hai giả định sai lầm về Debian và các dẫn xuất: 1) Mục đích của conf.dthư mục là cấu hình máy chủ toàn như thế cho module, plugin, xử lý fastcgi vv và dứt khoát không để lưu trữ máy chủ cấu hình / vhost trong và 2) Người ta không nên chỉnh sửa bất kỳ tệp nào trong sites-enabled serverfault.com/a/825297/86189
Bojan Markovic

@BojanMarkovic, bạn sai rồi. Bạn không thể phục vụ các cấu hình trên toàn máy chủ conf.d, bởi vì nó được bao gồm trong cùng bối cảnh với bối cảnh sites-enabledmột - httpcấp độ, do đó, các chỉ thị mô-đun và plugin có thể không được áp dụng. Tương tự như vậy, giả định của bạn rằng người ta không nên chỉnh sửa các tệp trong đó sites-enabledchỉ là suy nghĩ mong muốn - không có hướng dẫn nào như vậy trong bản phân phối, hoặc trong thư mục, do đó, đó hoàn toàn là giả định của bạn, do không được thực thi bởi phân phối, vì vậy, bạn có tất cả các loại vấn đề phát sinh từ nó, ví dụ: stackoverflow.com/q/45852224/1122270 .
cnst

Vấn đề bạn chỉ ra hoàn toàn không có liên quan đến điều này. Tôi có thể sai về việc conf.d, có lẽ, người duy trì Debian của Nginx (hoặc có lẽ nó được giữ để tương thích với ngược dòng). Về việc không chỉnh sửa các tệp trong sites-enabledđó, đó không phải là suy nghĩ mong muốn mà là dòng chảy được cho là theo Apache mà họ đã cố gắng mô phỏng trên Nginx. Trong apache nó khá rõ ràng do sự tồn tại của a2ensitea2dissitekịch bản. Thật không may, không có thứ gì được cung cấp cho Nginx, điều này cho thấy chất lượng bảo trì của gói đó thấp như thế nào trên Debian. Cả hai đều thiếu tài liệu, đúng.
Bojan Markovic

2
.. Tôi sẽ cung cấp cho bạn điều đó (tài liệu rất thiếu về vấn đề này). Tuy nhiên, bạn là người đầu tiên chạy các máy chủ web trên Debian mà tôi đã nói chuyện đã bị nhầm lẫn bởi điều này. Chỉ đơn giản ls -al sites-enabledtrong Apache hoặc Nginx cho thấy các tệp hiện có trong thư mục là các liên kết tượng trưng từ -available, ditto cho các mô-đun trong Apache, cùng với được cung cấp a2enmod/ a2dismodscirpts.
Bojan Markovic

1
@pzrq, bạn đang đánh đồng rất nhiều thứ không liên quan; khả dụng / kích hoạt không liên quan gì đến apache hay debian; không có bằng chứng ngược lại, về cơ bản nó chỉ là thứ mà một số người bảo trì đã lẻn vào đúng chỗ vào đúng thời điểm khi không ai tìm kiếm, và nó bị mắc kẹt; Có rất ít lý do để tiếp tục sử dụng nó nếu bạn đã dành tài nguyên để chuyển sang nginx, điều này sẽ yêu cầu viết lại cấu hình để thoát khỏi .htaccess, chẳng hạn - cũng có thể tiêu chuẩn hóa cấu hình của bạn với tất cả các đám mây và phân phối , đó là đủ dễ dàng với nguyên trạng conf.d.
cnst

1

Một phương pháp khác chỉ là đổi tên tập tin cấu hình của trang web thành một cái gì đó kết thúc mà không có .conf

Ví dụ sudo mv mysite.conf mysite.conf.disabled

Sau đó tải lại nginx và vhost đó sẽ trở về mặc định.


Thật tuyệt khi sử dụng lệnh nginx_modsite, bạn có thể liệt kê, vô hiệu hóa, kích hoạt trang web dễ dàng và nhanh hơn nhiều so với việc đổi tên tệp mỗi lần @Pyrite
Ghassen Telmoudi

3
@Pyrite Trên Ubuntu 14.04, tiện ích mở rộng không có nghĩa là nginx.conf bao gồm các trang web được kích hoạt vì include /etc/nginx/sites-enabled/*;nó chỉ bao gồm các thư mục như*.conf
Bojan Markovic

2
@GhassenTelmoudi vì tập lệnh mà bạn nhắc đến là tập lệnh của bên thứ ba, thậm chí không được người tạo (ub Ubuntu) đóng gói vào gói nginx, nhận xét của bạn đề nghị sử dụng tập lệnh của bên thứ ba thay thế cho dòng lệnh (một dòng). Đây là cách các lỗ hổng bảo mật và các cây phụ thuộc phức tạp không cần thiết được tạo ra.
bánh nướng

1
@cnst Tôi sẽ không gọi nó là xấu xa, đặc biệt là sự lựa chọn của họ sites-availablesites-enablednhư họ có công đức và sử dụng. Ai đó có lẽ chỉ nên nộp báo cáo lỗi cho dòng vi phạm thực sự trong nginx conf /etc/nginx/sites-enabled/*.conf;và họ có thể sẽ làm như đó có thể là một sự giám sát. Nhưng nếu bạn tôn trọng quy trình làm việc của Debian, bạn sẽ chỉnh sửa các tệp bằng sites-availablemọi cách và liên kết với các tệp bạn muốn kích hoạt sites-enabled.
Bojan Markovic

1
@cnst Tại sao khá rõ ràng phải không? Nó cho phép bạn kích hoạt và vô hiệu hóa vhost mà không cần xóa chúng, theo cách giống hệt nhau trên cả apache và nginx. Việc bạn đặc biệt quan tâm đến nginx không làm mất hiệu lực ý định cung cấp phương thức bật / tắt tương tự cho cả hai máy chủ web.
Bojan Markovic
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.