Nginx เปิดใช้งานคำสั่งของไซต์


131

เราทุกคนรู้วิธีเปิดใช้งานเว็บไซต์โดยใช้ apache บน linux ฉันค่อนข้างแน่ใจว่าเราทุกคนเห็นด้วยกับการใช้คำสั่ง a2ensite

น่าเสียดายที่ไม่มีคำสั่งเทียบเท่าเริ่มต้นที่มาพร้อมกับ Nginx แต่มันเกิดขึ้นว่าฉันติดตั้งแพคเกจบางอย่างบน Ubuntu ที่อนุญาตให้ฉันเปิด / ปิดการใช้งานไซต์และแสดงรายการ

ปัญหาคือฉันจำชื่อของแพ็คเกจนี้ไม่ได้

ใครรู้ว่าฉันกำลังพูดถึงอะไร

กรุณาบอกชื่อของแพ็คเกจนี้และชื่อคำสั่ง


5
การยืนยันเกี่ยวกับ a2ensite นั้นไม่เป็นความจริงสำหรับ CentOS
9517

คำตอบ:


166

หากคุณติดตั้งnginxแพคเกจจากที่เก็บ Ubuntu คุณจะมีสองไดเรกทอรี

/etc/nginx/sites-enabled/etc/nginx/sites-availableและ

ในการกำหนดค่า nginx หลัก/etc/nginx/nginx.confคุณมีบรรทัดต่อไปนี้:

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

ดังนั้นโดยทั่วไปแล้วในรายการ virtualhosts ที่มีอยู่ทั้งหมดคุณสามารถเรียกใช้คำสั่งต่อไปนี้:

ls /etc/nginx/sites-available

หากต้องการเปิดใช้งานหนึ่งในนั้นให้เรียกใช้คำสั่งต่อไปนี้:

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

สคริปต์ที่มาพร้อมกับ Apache นั้นเป็นเพียงแค่ shell shell ธรรมดาที่ทำสิ่งที่คล้ายกัน

หลังจากเชื่อมโยงไฟล์อย่าลืมเรียกใช้sudo service nginx reload/service nginx reload


5
ใช่ฉันรู้วิธีการที่ใช้บรรทัดคำสั่งขอบคุณ
Ghassen Telmoudi

23
ถ้าอย่างนั้นฉันก็ไม่แน่ใจในสิ่งที่คุณขอ
pkhamre

3
อย่าลืมรีโหลดเซิร์ฟเวอร์ nginx ด้วย: sudo service nginx reload
Ricardo Martins

16
@pkhamre: เมื่อใช้ Apache มีสองสคริปต์คือ a2ensite และ a2dissite พวกเขาเพียงสร้างและลบลิงก์สัญลักษณ์ที่คุณอธิบายเพื่อให้เป็นวิธีเปิดใช้งานและปิดใช้งานได้เร็วขึ้น
Mads Skjern

6
ขอบคุณสำหรับ upvotes คงที่ในคำตอบเก่านี้ ถ้า OP ยอมรับคำตอบนี้มันคงเป็นมหากาพย์ :)
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 ฉันใส่ความคิดเห็นในการอ่านและเพียงแค่ทำการรีโหลด = "y" เนื่องจากฉันเรียกใช้ผ่าน cron และไม่ต้องการพรอมต์เลย ขอบคุณ!
radtek

ใช่มันเป็นความรู้สึกที่สมบูรณ์แบบคุณสามารถบอกฉันได้ไหมว่าคุณเปลี่ยนแปลงอะไร
Ghassen Telmoudi

10
สคริปต์ที่มีขนาดใหญ่พอที่จะห่อคำสั่งบรรทัดเดียวมาตรฐานได้
tobltobs

1
@tobltobs โปรแกรมเมอร์ที่ดีเขียนรหัสโปรแกรมเมอร์ที่ดีขโมยรหัส :) ทำให้ดีเพิ่มในชุดของฉันของสคริปต์ภาพเซิร์ฟเวอร์
rdev5

5
@GhassenTelmoudi เป็นสคริปต์ที่คุณพูดถึงเป็นสคริปต์ของบุคคลที่สามซึ่งไม่ได้บรรจุโดยผู้สร้าง (ubuntu) ในแพ็คเกจ nginx ความคิดเห็นของคุณแนะนำให้ใช้สคริปต์บุคคลที่สามผ่านทางเลือกบรรทัดคำสั่ง (หนึ่งบรรทัด) นี่คือวิธีสร้างความอ่อนแอด้านความปลอดภัยและต้นไม้พึ่งพาที่ซับซ้อนโดยไม่จำเป็น
สโคน

32

คุณหมายถึงnginx_ensiteและnginx_dissite?


16
นี่เป็นคำตอบที่ใช่หรือไม่? คำสั่งเหล่านี้ไม่มีอยู่ในการติดตั้ง nginx ของฉันใน Ubuntu ที่ติดตั้งด้วย apt-get ดูเหมือนว่าจะเป็นเพียงสคริปต์บุคคลที่สาม: github.com/perusio/nginx_ensite
Mads Skjern

5
@MadsSkjern หากนี่เป็น "คำตอบที่แทบจะไม่" คำตอบที่ได้รับการยอมรับก็ไม่ได้เป็นของใครเช่นกัน!
Michael Hampton

3
ก่อนอื่นขอขอบคุณสำหรับการตอบคำถาม :) และขออภัยสำหรับความคิดเห็นของฉันซึ่งอาจฟังดูไม่เหมาะสมเมื่อจริง ๆ แล้วฉันเพียงต้องการชี้ให้เห็นว่ามันไม่ได้มีประโยชน์มากสำหรับฉัน (ในเวลา) เพราะมันถือว่ามากเกินไปจาก ผู้อ่าน
Mads Skjern

25
คุณตอบด้วยสองคำสั่งและ URL และแม้แต่ในรูปแบบของคำถาม ในฐานะที่เป็นคนที่มีประสบการณ์ระดับต่ำของฉันคำตอบของคุณจะส่งฉันไปที่นั่น googling บางทีฉันอาจพบคำแนะนำที่เป็นประโยชน์ / บทช่วยสอน / การสาธิตใน 2 นาทีบางทีฉันอาจจะมองไปรอบ ๆ เป็นเวลาหนึ่งชั่วโมงและยังคงสับสน สิ่งที่จะช่วยฉันในตอนนั้นคือ: "มีเครื่องมือเหล่านี้ 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;
}

Debian / Ubuntu

อย่างไรก็ตามหากคุณใช้อนุพันธ์ Debian / Ubuntu นอกจากนี้conf.dคุณยังอาจมีความชั่วร้ายที่ไม่ได้มาตรฐานsites-availableและsites-enabledไดเรกทอรีไฟล์บางไฟล์ที่อาจรวมอยู่ในที่ไม่ต่อเนื่องโดยไม่คำนึงถึงส่วนขยาย:

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

ดังนั้นใน Debian / Ubuntu คุณอาจต้องทราบก่อนว่าที่ตั้งของการตั้งค่าไซต์นั้นอยู่ที่ใด

  • คุณสามารถใช้คำสั่งต่อไปนี้เพื่อรับรายการของไซต์ที่มีอยู่ทั้งหมดโดยการเรียกใช้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/*" \)

จากนั้นให้ปิดการใช้งาน / เปิดใช้งานไซต์บน Debian / Ubuntu:

  • หากต้องการปิดการใช้งานเว็บไซต์: หากมีการตั้งค่าconf.dให้เปลี่ยนชื่อไฟล์เพื่อไม่มี.confคำต่อท้าย หรือถ้าในย้ายมันออกมาจากsites-enabledsites-enabled

  • หากต้องการเปิดใช้งานไซต์วิธีที่ดีที่สุดคือย้ายไปที่/etc/nginx/conf.dและเปลี่ยนชื่อเป็น.confส่วนต่อท้าย

ป.ล. ทำไมฉันถึงคิดว่าเดเบียนinclude /etc/nginx/sites-enabled/*;เป็นคนชั่ว ลองแก้ไขไฟล์สองสามไฟล์ในไดเรกทอรีนั้นและให้คุณemacsสร้างไฟล์สำรอง (ด้วย~คำต่อท้าย) จากนั้นถามฉันอีกครั้ง


4
ฉันต้องการจะชี้ให้เห็นว่าปัญหาของคำตอบนี้อยู่ในสองข้อสันนิษฐานที่ผิดพลาดเกี่ยวกับ Debian และอนุพันธ์: 1) วัตถุประสงค์ของconf.dไดเรกทอรีคือการกำหนดค่าทั่วทั้งเซิร์ฟเวอร์เช่นนั้นสำหรับโมดูลปลั๊กอินตัวจัดการ fastcgi ฯลฯ และไม่เก็บโฮสต์อย่างชัดเจน/ vhost การกำหนดค่าในและ 2) หนึ่งไม่ควรแก้ไขไฟล์ใด ๆ ในsites-enabled serverfault.com/a/825297/86189
Bojan Markovic

@BojanMarkovic คุณผิด คุณไม่สามารถให้บริการการกำหนดค่าทั่วทั้งเซิร์ฟเวอร์ในconf.dเนื่องจากมีการรวมไว้ในบริบทเดียวกันกับบริบทแบบsites-enabledหนึ่งhttpระดับดังนั้นคำสั่งโมดูลและปลั๊กอินอาจไม่มีผล ในทำนองเดียวกันข้อสันนิษฐานของคุณที่ว่าไม่ควรแก้ไขไฟล์ในsites-enabledนั้นเป็นเพียงแค่ความคิดที่ปรารถนา - ไม่มีคำแนะนำดังกล่าวใน distro หรือในไดเรกทอรีดังนั้นจึงเป็นข้อสันนิษฐานของคุณอย่างแท้จริงซึ่งไม่มีการบังคับใช้โดยการกระจายดังนั้นคุณ มีทุกประเภทของปัญหาที่เกิดขึ้นออกมาจากมันเช่นstackoverflow.com/q/45852224/1122270
cnst

ปัญหาที่คุณชี้ไปไม่มีความเชื่อมโยงกับสิ่งนี้ ฉันผิดเกี่ยวกับที่conf.dเป็นอยู่คงเป็นผู้ดูแล Debian ของ Nginx (หรือบางทีมันอาจถูกเก็บไว้เพื่อความเข้ากันได้กับ upstream) เกี่ยวกับการไม่แก้ไขไฟล์ในsites-enabledมันไม่ใช่ความคิดที่น่าปรารถนา แต่สิ่งที่ควรกังวลภายใต้ Apache ซึ่งพวกเขาพยายามเลียนแบบบน Nginx ใน apache มันค่อนข้างชัดเจนเนื่องจากมีอยู่a2ensiteและa2dissiteสคริปต์ น่าเสียดายที่ไม่มีการจัดเรียงใด ๆ สำหรับ Nginx ซึ่งแสดงให้เห็นว่าคุณภาพการบำรุงรักษาของแพ็คเกจนั้นต่ำเพียงใดใน Debian ทั้งเอกสารขาดจริง
Bojan Markovic

2
.. ฉันจะให้คุณว่า (เอกสารขาด abysmally ในเรื่องนี้) อย่างไรก็ตามคุณเป็นคนแรกที่ใช้งานเว็บเซิร์ฟเวอร์ใน Debian ฉันได้พูดคุยกับสิ่งนี้ด้วยความสับสน เพียงง่าย ๆls -al sites-enabledใน Apache หรือ Nginx แสดงให้เห็นว่าไฟล์ที่มีอยู่ในไดเรกทอรีเป็น symlinks จาก-availableนั้นเช่นเดียวกันสำหรับโมดูลภายใต้ Apache พร้อมกับให้a2enmod/ a2dismodscirpts
Bojan Markovic

1
@pzrq คุณกำลังเปรียบเทียบสิ่งต่าง ๆ ที่ไม่เกี่ยวข้องกันมากมาย ที่มีอยู่ / เปิดใช้งานไม่เกี่ยวข้องกับ apache หรือ debian; หลักฐานที่ล้มเหลวในทางตรงกันข้ามมันเป็นเพียงบางสิ่งบางอย่างที่ผู้ดูแลบางคนแอบเข้าไปในสถานที่ที่ถูกต้องในเวลาที่เหมาะสมเมื่อไม่มีใครมองและมันก็ติดอยู่ มีเหตุผลเล็กน้อยที่จะใช้งานต่อไปหากคุณใช้ทรัพยากรในการเปลี่ยนไปใช้ nginx อยู่แล้วซึ่งจะต้องใช้การแก้ไขการตั้งค่าใหม่เพื่อกำจัด. htaccess ตัวอย่างเช่น - อาจปรับมาตรฐานการกำหนดค่าของคุณด้วยคลาวด์และ distros ซึ่งง่ายพอกับที่conf.dเป็นอยู่
cnst

1

อีกวิธีหนึ่งคือเปลี่ยนชื่อไฟล์กำหนดค่าของเว็บไซต์เป็นสิ่งที่สิ้นสุดโดยไม่มี. conf

เช่น sudo mv mysite.conf mysite.conf.disabled

จากนั้นรีโหลด nginx และ vhost นั้นจะถอยกลับไปเป็นค่าเริ่มต้น


เป็นเรื่องดีเสมอที่จะใช้คำสั่ง nginx_modsite คุณสามารถแสดงรายการปิดใช้งานเปิดใช้งานไซต์ได้ง่ายและเร็วกว่าการเปลี่ยนชื่อไฟล์ทุกครั้งที่ @Pyrite
Ghassen Telmoudi

3
@Pyrite บน Ubuntu 14.04 ส่วนขยายไม่ได้มีความสำคัญเท่าที่ nginx.conf รวมถึงเว็บไซต์ที่เปิดใช้งานเนื่องจากinclude /etc/nginx/sites-enabled/*;มีเฉพาะ conf conf เช่นเดียวกับ*.conf
Bojan Markovic

2
@GhassenTelmoudi เป็นสคริปต์ที่คุณพูดถึงเป็นสคริปต์ของบุคคลที่สามซึ่งไม่ได้บรรจุโดยผู้สร้าง (ubuntu) ในแพ็คเกจ nginx ความคิดเห็นของคุณแนะนำให้ใช้สคริปต์บุคคลที่สามผ่านทางเลือกบรรทัดคำสั่ง (หนึ่งบรรทัด) นี่คือวิธีสร้างช่องโหว่ด้านความปลอดภัยและแผนผังการพึ่งพาที่ซับซ้อนโดยไม่จำเป็น
โคน

1
@cnst ฉันจะไม่ไปไกลเท่าที่เรียกว่าความชั่วร้ายโดยเฉพาะอย่างยิ่งการเลือกของพวกเขาsites-availableและsites-enabledตามที่พวกเขามีบุญและใช้ ใครบางคนอาจแค่รายงานข้อผิดพลาดสำหรับบรรทัดที่ละเมิดจริงใน nginx conf /etc/nginx/sites-enabled/*.conf;และพวกเขาอาจจะเป็นเพราะมันอาจจะเป็นการกำกับดูแล แต่ถ้าคุณเคารพเวิร์กโฟลว์ Debian คุณจะสามารถแก้ไขไฟล์ได้sites-availableและเชื่อมโยงไฟล์ที่คุณต้องการเปิดใช้งานเข้าsites-enabledด้วยกัน
Bojan Markovic

1
@cnst ทำไมตัวเองค่อนข้างชัดเจนไม่ได้หรือไม่ มันช่วยให้คุณสามารถเปิดใช้งานและปิดการใช้งาน vhosts โดยไม่ต้องลบพวกเขาในลักษณะที่เหมือนกันทั้งใน apache และ nginx ความจริงที่ว่าคุณมีความสนใจเฉพาะใน Nginx ไม่ได้ทำให้ความตั้งใจ Debian ดูแลของการให้บริการที่คล้ายกันวิธีการเปิด / ปิดการใช้งานสำหรับทั้งเว็บเซิร์ฟเวอร์
Bojan Markovic
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.