Nginx mengaktifkan perintah situs

131

Kita semua tahu cara mengaktifkan situs web menggunakan apache di linux. Saya cukup yakin bahwa kita semua setuju untuk menggunakan perintah a2ensite.

Sayangnya tidak ada perintah setara standar yang datang dengan Nginx, tetapi kebetulan saya menginstal beberapa paket di ubuntu yang memungkinkan saya untuk mengaktifkan / menonaktifkan situs dan mendaftarnya.

Masalahnya adalah saya tidak ingat nama paket ini.

Adakah yang tahu apa yang saya bicarakan?

Tolong beritahu saya nama paket ini dan nama perintah.

Ghassen Telmoudi
sumber
5
Pernyataan tentang a2ensite tidak benar untuk CentOS
user9517

Jawaban:

166

Jika Anda telah menginstal nginxpaket dari repositori Ubuntu, Anda akan memiliki dua direktori.

/etc/nginx/sites-enableddan /etc/nginx/sites-available.

Di konfigurasi nginx utama /etc/nginx/nginx.conf,, Anda memiliki baris berikut:

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

Jadi pada dasarnya untuk mendaftar semua virtualhost yang tersedia, Anda dapat menjalankan perintah berikut:

ls /etc/nginx/sites-available

Untuk mengaktifkan salah satunya, jalankan perintah berikut:

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

Skrip yang disertakan dengan Apache pada dasarnya hanyalah pembungkus shell sederhana yang melakukan sesuatu yang mirip seperti di atas.

Setelah menautkan file, ingatlah untuk menjalankan sudo service nginx reload/service nginx reload

pkhamre
sumber
5
Ya saya tahu caranya menggunakan baris perintah, terima kasih
Ghassen Telmoudi
23
Maka saya tidak yakin apa yang sebenarnya Anda minta.
pkhamre
3
jangan lupa memuat ulang server nginx dengan: sudo service nginx reload
Ricardo Martins
16
@ pkhamre: Saat menggunakan Apache ada dua skrip: a2ensite dan a2dissite. Mereka hanya membuat dan menghapus tautan simbolik yang Anda gambarkan, jadi itu adalah cara yang lebih cepat untuk mengaktifkan dan menonaktifkan.
Mads Skjern
6
Terima kasih atas upvotes konstan pada jawaban lama ini. Jika OP akan menerima jawaban ini, itu akan menjadi epik :)
pkhamre
69

Cukup buat skrip ini /usr/bin/nginx_modsitedan buat itu bisa dieksekusi.

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

Bagaimana itu bekerja:

Untuk membuat daftar semua situs

$ sudo nginx_modsite -l

Untuk mengaktifkan situs "test_website"

$ sudo nginx_modsite -e test_website

Untuk menonaktifkan situs "test_website"

$ sudo nginx_modsite -d test_website
Ghassen Telmoudi
sumber
dalam fungsi ngx_relaod, saya berkomentar membaca dan hanya membuat reload = "y" karena saya menjalankan ini melalui cron dan tidak ingin prompt sama sekali. Terima kasih!
radtek
ya itu masuk akal, dapatkah Anda memberi tahu saya di mana Anda melakukan perubahan?
Ghassen Telmoudi
10
Script yang cukup besar untuk membungkus beberapa perintah satu baris standar.
tobltobs
1
@tobltobs Programmer yang baik menulis kode, programmer yang hebat mencuri kode :) Ini membuat tambahan yang bagus untuk koleksi skrip pencitraan server saya.
rdev5
5
@GhassenTelmoudi sebagai skrip yang terus Anda sebutkan adalah skrip pihak ketiga, yang bahkan tidak dipaket oleh pembuatnya (ubuntu) ke dalam paket nginx, komentar Anda menyarankan untuk menggunakan skrip pihak ketiga melalui alternatif baris perintah (satu baris). Ini adalah bagaimana kerentanan keamanan dan pohon ketergantungan kompleks yang tidak perlu dibuat
scone
32

Apakah Anda mengacu pada nginx_ensitedan nginx_dissite?

Michael Hampton
sumber
16
Ini bukan jawaban, bukan? Perintah-perintah ini tidak ada pada instalasi nginx saya, pada Ubuntu yang diinstal dengan apt-get. Sepertinya ini hanya skrip pihak ke-3: github.com/perusio/nginx_ensite
Mads Skjern
5
@MadsSkjern Jika ini "nyaris bukan jawaban" maka jawaban yang diterima juga tidak banyak!
Michael Hampton
3
Pertama-tama, terima kasih telah menjawab :) Dan maaf untuk komentar saya, yang mungkin terdengar menyinggung, ketika saya sebenarnya hanya ingin menunjukkan bahwa itu tidak terlalu berguna bagi saya (pada saat itu), karena itu mengasumsikan terlalu banyak dari pembaca.
Mads Skjern
25
Anda menjawab dengan dua perintah dan satu url, dan bahkan dalam bentuk pertanyaan. Sebagai seseorang dengan tingkat pengalaman saya yang rendah, jawaban Anda akan mengirim saya ke sana dengan googling. Mungkin saya akan menemukan panduan / tutorial / demo bermanfaat dalam 2 menit, mungkin saya akan mencari sekitar satu jam dan masih bingung. Apa yang akan membantu saya saat itu adalah: "Ada alat-alat ini nginx_ensite dan nginx_dissite, ini adalah skrip pihak ke-3, unduh dari sini, dan mereka bekerja dengan cara ini, contoh, contoh". Jawaban Ghassen lebih rumit, lebih perkenalan, lebih bermanfaat. Saya harap Anda mengerti apa yang saya maksud :)
Mads Skjern
8
@ MadSkjern Nah, Anda bisa mengklik tautannya. :)
Michael Hampton
4

NGINX

Jika Anda menggunakan salah satu paket hulu resmi nginx dari http://nginx.org/packages/ , cara terbaik adalah menavigasi ke /etc/nginx/conf.ddirektori, dan mengganti nama file yang terpengaruh dari memiliki .confakhiran menjadi akhiran yang berbeda. nonaktifkan situs:

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

Atau sebaliknya untuk mengaktifkannya:

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

Ini karena default /etc/nginx/nginx.confmemiliki includearahan berikut :

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

Debian / Ubuntu

Namun, jika Anda menggunakan turunan Debian / Ubuntu, maka selain itu conf.d, Anda juga mungkin memiliki direktori dan standar jahatsites-availablesites-enabled , beberapa file yang mungkin dimasukkan dengan sembrono tanpa memperhatikan ekstensi mereka:

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

Dengan demikian, di Debian / Ubuntu, Anda mungkin harus mencari tahu di mana konfigurasi situs berada.

  • Anda bisa menggunakan perintah berikut untuk mendapatkan daftar semua situs yang tersedia dengan menjalankan find(1)untuk menemukan semua file biasa yang cocok dengan topeng yang diberikan:

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

  • Anda dapat menggunakan perintah berikut untuk mendapatkan daftar semua situs yang diaktifkan :

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

Kemudian untuk menonaktifkan / mengaktifkan situs di Debian / Ubuntu:

  • Untuk menonaktifkan situs: jika konfigurasi dalam conf.d, cukup ganti nama file untuk tidak lagi memiliki .confakhiran; atau jika dalam sites-enabled, pindahkan dari sites-enabled.

  • Untuk mengaktifkan situs, cara terbaik adalah memindahkannya /etc/nginx/conf.d, dan mengganti nama menjadi .confsufiks.

PS Mengapa saya pikir Debian itu include /etc/nginx/sites-enabled/*;jahat? Coba edit beberapa file di direktori itu, dan minta Anda emacsmembuat file cadangan (dengan ~akhiran), lalu tanya saya lagi.

cnst
sumber
4
Saya ingin menunjukkan bahwa masalah dengan jawaban ini terletak pada dua asumsi yang salah mengenai Debian dan turunannya: 1) Tujuan conf.ddirektori adalah konfigurasi di seluruh server seperti itu untuk modul, plugin, penangan fastcgi dll dan secara eksplisit tidak menyimpan host konfigurasi / vhost di dan 2) Seseorang tidak boleh mengedit file apa pun di sites-enabled serverfault.com/a/825297/86189
Bojan Markovic
@ BojanMarkovic, Anda salah. Anda tidak dapat melayani konfigurasi di seluruh server conf.d, karena ini termasuk pada konteks yang sama dengan konteks sites-enabledsatu- httptingkat, jadi, arahan modul dan plugin mungkin tidak berlaku. Demikian juga, asumsi Anda bahwa seseorang tidak boleh mengedit file sites-enabledhanya angan-angan - tidak ada instruksi seperti itu di dalam distro, atau di dalam direktori, jadi, itu murni asumsi Anda, yang sama sekali tidak ditegakkan oleh distribusi, jadi, Anda memiliki segala macam masalah yang timbul darinya, misalnya, stackoverflow.com/q/45852224/1122270 .
cnst
Masalah yang Anda tunjukkan sama sekali tidak ada hubungannya dengan ini. Saya salah tentang conf.dapa, mungkin, pengelola Debian Nginx (atau mungkin disimpan untuk kompatibilitas dengan hulu). Tentang tidak mengedit file di sites-enabled, itu bukan angan-angan tapi yang seharusnya mengalir di bawah Apache yang mereka coba tiru di Nginx. Dalam apache itu cukup jelas karena keberadaan a2ensitedan a2dissiteskrip. Sayangnya tidak ada yang disediakan untuk Nginx yang menunjukkan betapa rendahnya kualitas perawatan paket itu di Debian. Keduanya kekurangan dokumentasi, benar.
Bojan Markovic
2
..Aku akan memberimu itu (dokumen sangat kurang dalam hal ini). Namun Anda adalah orang pertama yang menjalankan server web di Debian yang saya ajak bicara yang bingung dengan ini. Hanya sederhana ls -al sites-enableddi Apache atau Nginx menunjukkan bahwa file yang ada di direktori adalah symlinks -available, ditto untuk modul di bawah Apache, bersama dengan yang disediakan a2enmod/ a2dismodscirpts.
Bojan Markovic
1
@ pzrq, Anda menyamakan banyak hal yang tidak terkait; yang tersedia / diaktifkan tidak ada hubungannya dengan apache atau debian; sebaliknya, sebaliknya, itu hanyalah sesuatu yang oleh beberapa pengelola menyelinap ke tempat yang tepat pada waktu yang tepat ketika tidak ada yang melihat, dan itu macet; ada sedikit alasan untuk terus menggunakannya jika Anda sudah menghabiskan sumber daya untuk transisi ke nginx, yang sudah membutuhkan konfigurasi penulisan ulang untuk menyingkirkan .htaccess, misalnya - mungkin juga membakukan konfigurasi Anda dengan semua cloud dan distro dalam pikiran , yang cukup mudah dengan conf.dapa adanya.
cnst
1

Metode lain adalah mengubah nama file konfigurasi situs menjadi sesuatu yang berakhir tanpa .conf

Misalnya sudo mv mysite.conf mysite.conf.disabled

Kemudian muat ulang nginx, dan vhost itu akan kembali ke default.

Pirit
sumber
itu selalu menyenangkan untuk menggunakan perintah nginx_modsite, Anda dapat membuat daftar, menonaktifkan, mengaktifkan situs lebih mudah dan lebih cepat, daripada mengganti nama file setiap kali @Pyrite
Ghassen Telmoudi
3
@Pyrite Pada Ubuntu 14.04 ekstensi tidak mater sebagai nginx.conf termasuk situs-diaktifkan karena include /etc/nginx/sites-enabled/*;hanya menyertakan conf dir as*.conf
Bojan Markovic
2
@GhassenTelmoudi sebagai skrip yang terus Anda sebutkan adalah skrip pihak ketiga, yang bahkan tidak dipaket oleh pembuatnya (ubuntu) ke dalam paket nginx, komentar Anda menyarankan untuk menggunakan skrip pihak ketiga melalui alternatif baris perintah (satu baris). Ini adalah bagaimana kerentanan keamanan dan pohon ketergantungan kompleks yang tidak perlu dibuat.
scone
1
@ cnst Saya tidak akan menyebutnya jahat, terutama pilihan mereka sites-availabledan sites-enabledkarena mereka memiliki jasa dan penggunaan. Seseorang mungkin hanya harus mengajukan laporan bug untuk baris menyinggung sebenarnya di nginx conf to /etc/nginx/sites-enabled/*.conf;dan mereka mungkin akan melakukannya karena itu mungkin sebuah pengawasan. Tetapi jika Anda menghormati alur kerja Debian Anda tetap akan mengedit file sites-availabledan menghubungkan yang ingin Anda aktifkan sites-enabled.
Bojan Markovic
1
@cnst. Mengapa cukup jelas bukan? Ini memungkinkan Anda untuk mengaktifkan dan menonaktifkan vhosts tanpa menghapusnya, dengan cara yang identik pada apache dan nginx. Fakta bahwa Anda secara eksklusif tertarik pada nginx tidak membatalkan niat pengelola Debian untuk menyediakan metode aktifkan / nonaktifkan yang serupa untuk kedua server web.
Bojan Markovic