Nginx site komutunu etkinleştir


131

Linux'ta apache kullanarak bir web sitesinin nasıl etkinleştirileceğini hepimiz biliyoruz. A2ensite komutunu kullanmak konusunda hepimizin hemfikir olduğuna eminim.

Maalesef Nginx ile gelen varsayılan bir eşdeğer komut yoktur, ancak ubuntu üzerine siteleri etkinleştirmeme / devre dışı bırakmama ve listelememe izin veren bir paket kurdum.

Sorun şu ki bu paketin adını hatırlamıyorum.

Ne hakkında konuştuğumu bilen var mı?

Lütfen bana bu paketin adını ve komut adını söyleyin.


5
A2ensite ile ilgili iddia CentOS için doğru değil
user9517 5:12

Yanıtlar:


166

nginxPaketi Ubuntu depolarından yüklediyseniz iki dizininiz olacaktır.

/etc/nginx/sites-enabledve /etc/nginx/sites-available.

Ana nginx yapılandırmasında, /etc/nginx/nginx.confaşağıdaki satıra sahip olursunuz:

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

Yani temelde mevcut tüm sanal ana bilgisayarları listelemek için aşağıdaki komutu çalıştırabilirsiniz:

ls /etc/nginx/sites-available

Bunlardan birini etkinleştirmek için aşağıdaki komutu çalıştırın:

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

Apache ile gelen scriptler temelde sadece yukarıdakilere benzer bir şey yapan basit kabuk sarmalayıcılarıdır.

Dosyaları bağlandıktan sonra, çalıştırmak için hatırlamak sudo service nginx reload/service nginx reload


5
Evet, komut satırını kullanarak nasıl yapılacağını biliyorum, teşekkürler
Ghassen Telmoudi

23
O zaman gerçekten ne istediğinden emin değilim.
pkhamre

3
nginx sunucusunu şununla yeniden kurmayı unutmayın: sudo service nginx yeniden yükle
Ricardo Martins

16
@pkhamre: Apache kullanırken iki komut dosyası vardır: a2ensite ve a2dissite. Onlar sadece tanımladığınız sembolik bağları yaratır ve silerler, böylece daha hızlı ve devre dışı bırakmanın daha hızlı yollarıdır.
Mads Skjern,

6
Bu eski cevabın sürekli artması için teşekkürler. OP bu cevabı kabul ederse epik olur :)
pkhamre

69

Sadece bu betiği oluşturun /usr/bin/nginx_modsiteve çalıştırılabilir hale getirin.

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

Nasıl çalışır:

Tüm siteleri listelemek için

$ sudo nginx_modsite -l

"Test_website" sitesini etkinleştirmek için

$ sudo nginx_modsite -e test_website

"Test_website" sitesini devre dışı bırakmak için

$ sudo nginx_modsite -d test_website

ngx_relaod işlevinde, okumayı yorumladım ve bunu cron üzerinden çalıştırdığım ve istemi hiç istemediğim için sadece yeniden yükleme = "y" yaptım. Teşekkürler!
radtek

evet bu mükemmel bir anlam ifade ediyor, değişikliği nerede yaptığınızı söyleyebilir misiniz?
Ghassen Telmoudi

10
Bazı standart tek satır komutlarını sarmak için oldukça büyük bir komut dosyası.
tobltobs

1
@tobltobs İyi programcılar kod yazar, harika programcılar kod çalır :) Bu, sunucu görüntüleme komut dosyaları koleksiyonuma güzel bir katkı sağlar.
rdev5,

5
@GhassenTelmoudi, bahsettiğiniz komut dosyası olarak, yaratıcılar tarafından bile (ubuntu) nginx paketine paketlenmemiş bir üçüncü taraf komut dosyasıdır, yorumunuz üçüncü taraf komut dosyasını bir (bir satır) komut satırı alternatifi üzerinden kullanmanızı önerir. Güvenlik açıkları ve gereksiz yere karmaşık bağımlılık ağaçları bu şekilde yaratılır
çörekler

32

Atıfta mısın nginx_ensiteve nginx_dissite?


16
Bu zar zor bir cevap, değil mi? Bu komutlar nginx kurulumumda, apt-get komutuyla yüklü Ubuntu'da mevcut değil. Sadece bir 3. parti senaryo gibi görünüyor: github.com/perusio/nginx_ensite
Mads Skjern

5
@MadsSkjern Eğer bu "ancak bir cevap" ise, o zaman kabul edilen cevap da bir cevap değil!
Michael Hampton

3
Her şeyden önce, cevap verdiğiniz için teşekkür ederim :) Ve belki de rahatsız edici görünen yorumum için üzgünüm, aslında sadece benim için çok yararlı olmadığına işaret etmek istediğimde (o zamanlar) okuyucu.
Mads Skjern

25
İki komut ve bir URL ile ve hatta bir soru şeklinde cevap verdiniz. Tecrübelerimin düşük olduğu biri olarak, cevabınız beni googling olarak gönderdi. Belki 2 dakika içinde yararlı bir rehber / öğretici / demo bulabilirim, belki bir saatliğine etrafa bakıp hala kafam karıştı. O zamanlar bana yardımcı olacak olan şey şuydu: "Bu araçlar nginx_ensite ve nginx_dissite var, 3. parti bir komut dosyası, buradan indirin ve bu şekilde çalışıyorlar, örneğin, örnek". Ghassen'in cevabı daha ayrıntılı, daha tanıtıcı, daha faydalı. Umarım ne demek istediğimi anlıyorsundur :)
Mads Skjern

8
@MadsSkjern Peki, linke tıklamanız gerekebilirdi. :)
Michael Hampton

4

nginx

Eğer kullanıyorsanız nginx resmi memba paketlerinden birini dan http://nginx.org/packages/ , en iyi yolu gitmek için olan /etc/nginx/conf.dbir zorunluluğundan etkilenen dosyayı dizine ve yeniden adlandırmak .confiçin farklı bir sahip eki siteyi devre dışı bırak:

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

Veya etkinleştirmek için tam tersi:

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

Bunun nedeni, varsayılanın /etc/nginx/nginx.confaşağıdaki includeyönergeye sahip olmasıdır:

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

Debian / Ubuntu

Ancak, eğer bir Debian / Ubuntu türevi kullanıyorsanız, o zaman ek olarak conf.d, standart olmayansites-available ve sites-enableddizinleri de kullanabilirsiniz; bunların altında, uzantıları dikkate alınmaksızın kaygan olarak dahil edilebilir.

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

Bu nedenle, Debian / Ubuntu'da, önce site config'in nerede olduğunu bulmanız gerekebilir.

  • Verilen maskeyle eşleşen tüm normal dosyaları bulmak için çalıştırarak mevcut tüm sitelerin listesini almak için aşağıdaki komutu kullanabilirsiniz find(1):

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

  • Tüm etkin sitelerin bir listesini almak için aşağıdaki komutu kullanabilirsiniz :

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

Ardından Debian / Ubuntu'daki siteleri devre dışı bırakmak / etkinleştirmek için:

  • To devre dışı bir site: config ise conf.d, sadece artık sahip dosyayı yeniden adlandırmak .confeki; veya eğer öyleyse sites-enabled, çıkartın sites-enabled.

  • To etkinleştirmek bir site, en iyi yolu taşımak olacaktır /etc/nginx/conf.dve olması adlandırmak .confeki.

PS Neden Debian'ın include /etc/nginx/sites-enabled/*;kötü olduğunu düşünüyorum ? Bu dizindeki birkaç dosyayı düzenlemeyi deneyin emacsve yedekleme dosyalarınızı ( ~sonek ile birlikte ) yaratın ve sonra tekrar sorun.


4
1) amacı: Bu cevap sorunu Debian ve türevleri ile ilgili olarak iki hatalı varsayımlar yatıyor işaret etmek istiyorum conf.ddizine modülleri eklentileri, Fastcgi işleyicileri vb için böyle bir sunucu çapında yapılandırma ve açık olarak değil ev sahibi saklamak için / 2) Bir ve içinde sankonun yapılandırmaları olmamalıdır herhangi dosyaları düzenlemek sites-enabled serverfault.com/a/825297/86189
Bojan Markoviç

@BojanMarkovic, yanılıyorsunuz. Sunucu genelinde yapılandırmaları tek seviyeli içerikle conf.daynı içeriğe dahil edildiğinden kullanamazsınız , bu nedenle modül ve eklenti yönergeleri geçerli olmayabilir. Aynı şekilde, bir kişinin dosyaları düzenlememesi gerektiği varsayımı , sadece arzu edilen bir düşüncedir - dağıtım veya dizin içerisinde böyle bir talimat yoktur, bu nedenle, yalnızca dağıtım tarafından zorlanmayan hiçbir şekilde sizin varsayımınız, bunlardan kaynaklanan her türlü sorunu yaşayın, örneğin stackoverflow.com/q/45852224/1122270 . sites-enabledhttpsites-enabled
17

Belirttiğiniz sorunun kesinlikle bununla bir bağlantısı yok. conf.dMuhtemelen, Debian'ın Nginx sağlayıcısı olduğu konusunda yanlıştır (ya da belki de yukarı havayla uyumluluk için korunur). Dosyaları düzenlememekle ilgili olarak sites-enabled, bu istek verici bir düşünce değil, Apache'nin altında Nginx'te öykünmeye çalıştıkları söylenen iş akışı. Apache'de bu a2ensiteve a2dissitescriptlerin varlığından dolayı oldukça açık . Ne yazık ki, Nginx için bu paketin bakım kalitesinin Debian'da ne kadar düşük olduğunu gösteren hiçbir sıralama yok. Her ikisi de dokümantasyondan yoksun, doğru.
Bojan Markovic

2
.. Size vereceğim (doktorlar bu konuda aşırı derecede eksiktirler). Bununla birlikte, Debian'da web sunucusu çalıştıran ilk kişisin ve bununla konuştum. Sadece bir ls -al sites-enabledApache veya Nginx'te basit olan, dizindeki mevcut dosyaların -availableApache altındaki modüller için sağlanan ditto ile birlikte sağlanan a2enmod/ a2dismodscirpts gibi işaretlerin olduğunu gösterir.
Bojan Markovic

1
@pzrq, ilgisiz birçok şeyi eşitliyorsunuz; kullanılabilir / etkin olan apache ve debian ile ilgisi yoktur; Aksine delilleri kırmamak, temelde sadece bir bakıcının kimsenin bakmadığı zamanda doğru yere doğru yere gizlice girdiği ve sıkışıp kaldığı bir şeydir; Kaynakları zaten nginx'e geçiş yapmak için harcıyorsanız kullanmaya devam etmek için çok az neden var, ki .htaccess'ten kurtulmak için zaten config rewrites (örneğin, yeniden yazma işlemlerini gerektirebilir) - konfigürasyonunuzu tüm bulutları ve dağıtımları göz önünde bulundurarak standartlaştırabilir , olduğu conf.dgibi kolay .
saat

1

Başka bir yöntem, sadece sitenin config dosyasını, .conf olmadan biten bir şeyle yeniden adlandırmaktır.

Örneğin sudo mv mysite.conf mysite.conf.disabled

Sonra nginx'i yeniden yükleyin ve bu vhost varsayılan değerlere geri dönecektir.


nginx_modsite komutunu kullanmak her zaman güzeldir, dosyayı her seferinde yeniden adlandırmak yerine, listeyi devre dışı bırakabilir, etkin kılan siteyi daha kolay ve hızlı bir şekilde listeleyebilirsiniz @Pyrite
Ghassen Telmoudi

3
@Pyrite Ubuntu 14.04'te, uzantı nginx.conf gibi materyaller içermiyor, include /etc/nginx/sites-enabled/*;sadece conf dir.*.conf
Bojan Markovic

2
@GhassenTelmoudi, bahsettiğiniz komut dosyası olarak, yaratıcılar tarafından bile (ubuntu) nginx paketine paketlenmemiş bir üçüncü taraf komut dosyasıdır, yorumunuz üçüncü taraf komut dosyasını bir (bir satır) komut satırı alternatifi üzerinden kullanmanızı önerir. Güvenlik açıkları ve gereksiz yere karmaşık bağımlılık ağaçları bu şekilde yaratılır.
çörekler

1
@cnst Ben buna kötülük diyebileceğim kadarıyla gitmem, özellikle onların seçimi sites-availableve sites-enabledyararları ve kullanımları gibi. Birileri muhtemelen nginx conf'teki gerçek rahatsız edici hat için bir hata raporu yazmalı /etc/nginx/sites-enabled/*.conf;ve muhtemelen muhtemelen bir gözetim altında olacaktır. Ancak Debian iş akışına saygı sites-availableduyuyorsanız, yine de dosyaları düzenliyor ve etkin olmasını istediğinizleri birbirine bağlıyorsunuz sites-enabled.
Bojan Markovic

1
@cnst Neden bu kadar açık ki değil mi? Vhost'ları silmeden , hem apache'de hem de nginx'de aynı şekilde etkinleştirmenize ve devre dışı bırakmanıza olanak tanır . Aslında sen hem web sunucuları için benzer etkinleştirme / devre dışı bırakma yöntemi sağlama Debian Maintainers' niyeti geçersiz kılmaz nginx münhasıran ilgileniyor.
Bojan Markovic
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.