เว็บเซิร์ฟเวอร์ที่มีน้ำหนักเบาบริสุทธิ์
โซลูชันง่าย ๆ ในการตั้งค่าเว็บไซต์ ท้องถิ่น โดยไม่มีการกำหนดค่าเซิร์ฟเวอร์ใด ๆ !!!
สิ่งนี้ได้รับแรงบันดาลใจจาก bashttpd แม้ว่าพฤติกรรมจะแตกต่างกันโดยสิ้นเชิง ดูข้อมูลเพิ่มเติมด้านล่าง
การนำเสนอ
วิธีใช้
วิธีใช้ (ผู้เชี่ยวชาญ)
ตัวอย่าง
เกี่ยวกับความปลอดภัย
ทำไมเชอร์เวอร์?
ใบอนุญาต?
เพียงแค่โคลนและเรียกใช้ ./sherver.sh จากนั้นคุณควรจะสามารถเชื่อมต่อกับ LocalHost: 8080 คุณสามารถส่งพอร์ตเพื่อฟังเป็นพารามิเตอร์: ./sherver.sh 8080 (ค่าเริ่มต้นคือ 8080 )
สิ่งนี้ถูกสร้างขึ้นมาเพื่อวิ่งด้วย Bash มันอาจไม่ทำงานในเปลือกอื่น เครื่องมือต่อไปนี้จะต้องมีอยู่ในระบบ (โปรดทราบว่าพวกเขาทั้งหมดเป็นส่วนหนึ่งของการติดตั้งเริ่มต้นของ Debian):
envsubst ถ้าคุณต้องการทำ templatingsocat เพื่อเรียกใช้เซิร์ฟเวอร์netcat แทนได้ แต่มันใช้งานได้ไม่ดีกับคำขอ HTTP ที่เกิดขึ้นพร้อมกันSherver เป็นเว็บเซิร์ฟเวอร์ที่ใช้ส่วนหนึ่งของ HTTP 1.0 แม้ว่ามันจะถูกเขียนในไม่กี่บรรทัดของการทุบตีมันก็สามารถทำอะไรได้มากมาย:
scripts หรือในโฟลเดอร์ filestdoutทั้งหมดนี้ทำให้ Sherver เป็นเครื่องมือที่สมบูรณ์แบบในการเรียกใช้เซิร์ฟเวอร์ขนาดเล็กที่จะให้บริการหน้าไม่กี่หน้าบนเครือข่ายท้องถิ่นของคุณ
แม้ว่ามันจะฟังดูยอดเยี่ยม Sherver ก็ยังมีข้อ จำกัด ดังต่อไปนี้:
นี่คือเหตุผลที่เชอร์เวอร์ควรจะอยู่ในสภาพแวดล้อมส่วนตัวและควบคุม อย่าเปิดเผย Sherver บนอินเทอร์เน็ต !!! หากคุณต้องการเปิดเผยเว็บไซต์ของคุณบนอินเทอร์เน็ตคุณควรใช้เครื่องมือที่รู้เกี่ยวกับความปลอดภัยและการเกิดขึ้นพร้อมกัน (เช่น Nginx หรืออื่น ๆ )
วิ่งเชอร์เวอร์ไว้ด้านหลังไฟร์วอลล์ที่ป้องกันการบุกรุกจากภายนอก
เอกสารด่วนเกี่ยวกับวิธีการใช้ Sherver เพื่อการใช้งานของคุณเอง ตัวแปรและฟังก์ชั่นทั้งหมดที่กล่าวถึงที่นี่มีคำอธิบายแบบเต็มในสคริปต์/readme.md
สิ่งที่ง่ายที่สุดที่คุณสามารถทำได้คือการให้บริการหน้าคงที่: ไฟล์ HTML บริสุทธิ์ที่ไม่ต้องการการประมวลผลใด ๆ
ในการทำเช่นนั้นคุณจะต้องใส่ไฟล์ HTML ของคุณในไฟล์/หน้าไดเรกทอรี จากนั้นคุณสามารถเข้าถึงหน้าเว็บของคุณผ่าน URL เช่น /file/pages/index.html (ถ้าชื่อไฟล์ของคุณคือ index.html เป็นต้น)
โปรดทราบว่าคุณจะต้องให้ชื่อไฟล์เต็มใน URL เพื่อให้ Sherver สามารถค้นหาได้
มันง่ายอย่างที่! หาก Sherver สามารถค้นหาไฟล์ได้มันจะให้บริการ มิฉะนั้นจะส่งคืนข้อผิดพลาด 404
คุณสามารถให้บริการไฟล์ทุกประเภทจาก Sherver จากข้อความเช่น CSS หรือ JavaScript ไปจนถึงไบนารีเช่นรูปภาพวิดีโอซิป ...
เพียงใส่ไฟล์ในไฟล์ไดเรกทอรีย่อย จากนั้นคุณสามารถอ้างอิงพวกเขาผ่าน URL เช่น /file/venise.webp โปรดทราบว่ามันจะดีกว่าที่จะให้เส้นทางเต็มมากกว่าเส้นทางที่สัมพันธ์กัน
Sherver จะให้บริการไฟล์โดยอัตโนมัติหากสามารถค้นหาได้ด้วยประเภท MIME ที่ถูกต้อง มันจะอนุญาตให้เบราว์เซอร์แคชไฟล์และจะให้บริการอีกครั้งหากไฟล์มีการเปลี่ยนแปลง หาก Sherver ไม่พบไฟล์มันจะส่งคืนข้อผิดพลาด 404
สำหรับทรัพยากรเช่น CSS, JavaScript, Favicon ... มันจะดีกว่าที่จะใส่ไว้ในไฟล์/ทรัพยากรโฟลเดอร์ย่อยแม้ว่าคุณจะไม่ต้องทำ
ตัวอย่างเกี่ยวกับวิธีการเชื่อมโยงไฟล์ CSS:
< link rel =" stylesheet " type =" text/css " href =" /file/resources/ugly.css " >ตัวอย่างเกี่ยวกับวิธีการรวมรูปภาพใน HTML ของคุณ:
< img src =" /file/venise.webp " alt ="" >นี่คือที่ที่เชอร์เวอร์มีประโยชน์: สามารถให้บริการหน้าแบบไดนามิกสร้างฝั่งเซิร์ฟเวอร์ที่สร้างขึ้นขึ้นอยู่กับบริบท
ในการทำเช่นนั้นคุณเพียงแค่ต้องเพิ่ม Executables ในสคริปต์โฟลเดอร์ย่อย Executables สามารถเป็นประเภทใดก็ได้ (สคริปต์ทุบตี, สคริปต์ Python, สคริปต์อื่น ๆ , ไบนารีใด ๆ เช่น C ++ ที่รวบรวมได้ ... ) ทันทีที่ Sherver สามารถเรียกใช้งานได้ (ต้องมีชุดตั้งค่าสถานะ executable )
ทันทีที่คุณมีการปฏิบัติการที่นั่นเชอร์เวอร์จะเรียกใช้และให้บริการผลลัพธ์ โปรดทราบว่า index.sh เป็นชื่อเฉพาะเนื่องจากเป็นชื่อที่จะดำเนินการโดย dispatcher หากคุณเข้าถึงรูทของเว็บไซต์ (ดูส่วน dispatcher ด้านล่าง) หาก Sherver ไม่สามารถเรียกใช้ไฟล์ใด ๆ ได้มันจะส่งคืนข้อผิดพลาด 404 หากการดำเนินการล้มเหลว (รหัสส่งคืนไม่ใช่ 0 ) จะส่งคืนข้อผิดพลาด 500
ในการเชื่อมโยงการเรียกใช้งานคุณต้องละเว้น scripts โฟลเดอร์ใน URL: /page.sh จะค้นหา ./scripts/page.sh
การปฏิบัติการถูกเรียกใช้จากโฟลเดอร์ scripts
สคริปต์ทุบตี
เชอร์เวอร์ส่วนใหญ่ทำเพื่อทำงานกับสคริปต์ทุบตี หากคุณสร้างสคริปต์ทุบตีสิ่งแรกที่คุณควรทำคือเรียกใช้ฟังก์ชั่น init_environment จากนั้นคุณจะสามารถเข้าถึงตัวแปรต่อไปนี้ทั้งหมด:
REQUEST_FULL_STRINGREQUEST_METHODREQUEST_URLREQUEST_HEADERSREQUEST_BODYURL_BASEURL_PARAMETERSDATERESPONSE_HEADERSHTTP_RESPONSEและยังมีฟังก์ชั่นที่มีประโยชน์มากมายเช่น:
add_headersend_responsesend_filesend_error ตรวจสอบเอกสารทั้งหมดเกี่ยวกับไลบรารี SHERVER_UTILS.sh ในสคริปต์/readme.md
ทุกอย่างที่เขียนบนเอาต์พุตมาตรฐานจะถูกส่งไปยังลูกค้า นี่คือสคริปต์ที่ง่ายมากที่ส่งคืนคำขอในรูปแบบข้อความ:
#! /bin/bash
init_environment
if [ " $REQUEST_METHOD " != ' GET ' ] ; then
send_error 405
fi
add_header ' Content-Type ' ' text/plain '
send_response 200 " $REQUEST_FULL_STRING "สคริปต์หรือไบนารีอื่น ๆ
หากคุณไม่ได้ใช้ Bash คุณจะสามารถเข้าถึงตัวแปรสภาพแวดล้อม REQUEST_FULL_STRING ที่มีคำขอเต็มเป็นสตริง URL ที่ร้องขอ ( REQUEST_URL ) จะถูกส่งเป็นอาร์กิวเมนต์แรก
ทุกสิ่งที่เขียนบนเอาต์พุตแบบสแตนด์อร์จะถูกส่งไปยังลูกค้า แม้ว่าคุณควรเขียนส่วนหัวของการตอบกลับด้วยตัวเอง
สำหรับสคริปต์ Bash มีเอ็นจิ้นเทมเพลตพื้นฐานที่รวมเข้ากับ Sherver (LOL) จริง ๆ แล้วมันใช้ envsubst เพื่อแทนที่การเกิดขึ้นของ $VARIABLE โดยตัวแปรจากสภาพแวดล้อมหากมี
คุณสามารถใส่เทมเพลตของคุณในสคริปต์/เทมเพลตย่อยของโฟลเดอร์แม้ว่ามันจะไม่บังคับ
นี่คือเทมเพลตสำหรับ text file template.txt (ที่ปรับปรุงตัวอย่างสคริปต์ Bash ก่อนหน้าของเรา):
You entered the following request:
$REQUEST
และคุณจะใช้กับสคริปต์ต่อไปนี้:
#! /bin/bash
init_environment
if [ " $REQUEST_METHOD " != ' GET ' ] ; then
send_error 405
fi
REQUEST= " $REQUEST_FULL_STRING "
# put REQUEST in the environment so we can use it in our template
export REQUEST
# load the template
response= $( envsubst < ' templates/template.txt ' )
add_header ' Content-Type ' ' text/plain '
send_response 200 " $response "ตัวอย่าง HTML แบบเต็มในตัวอย่างด้านล่าง
สนับสนุนคำขอโพสต์ คุณสามารถตรวจสอบค่าของตัวแปร REQUEST_METHOD ที่จะได้ GET หรือ POST ดังนั้นคุณสามารถมีพฤติกรรมที่แตกต่างกันตามประเภทของคำขอ
เนื้อหาของคำขอโพสต์สามารถนำมาใช้ใหม่ได้ในตัวแปร REQUEST_BODY หากข้อมูลถูกเข้ารหัส URL โดยไคลเอนต์คุณสามารถใช้ฟังก์ชั่น parse_url ด้วยเทคนิคบางอย่างเพื่อรับอาร์เรย์ที่เชื่อมโยงของพารามิเตอร์
เนื้อหาใด ๆ สามารถส่งกลับไปยังลูกค้า คุณสามารถเพิ่มประเภท MIME ที่ถูกต้องด้วยวิธี add_header
ตัวแปรและฟังก์ชั่นทั้งหมดที่กล่าวถึงที่นี่มีคำอธิบายแบบเต็มในสคริปต์/readme.md
สิ่งที่เขียนลงในข้อผิดพลาดมาตรฐานสามารถบันทึกได้ เพื่อความสะดวกในบันทึกคุณสามารถใช้ log ฟังก์ชั่น
ในการเก็บบันทึกไว้ในไฟล์คุณสามารถเปลี่ยนเส้นทางเอาต์พุตข้อผิดพลาดของ Sherver.sh ในไฟล์:
./sherver.sh 2> logs.txtโดยค่าเริ่มต้นส่วนหัวของทั้งคำขอและคำตอบจะถูกบันทึกไว้ แต่ไม่ใช่ร่างกาย
Dispatcher มีหน้าที่ขอให้เสิร์ฟไฟล์หรือเรียกใช้สคริปต์ขึ้นอยู่กับ UTL ที่ร้องขอ มันถูกนำไปใช้ในไฟล์ dispatcher.sh
ปัจจุบันมีการกระทำ 4 ครั้ง:
/ ) จะดำเนินการ scripts/index.shindex.htm หรือ index.html จะดำเนินการ scripts/index.sh/file/ จะให้บริการไฟล์ที่ถาม/test/dummy.sh จะเรียกใช้สคริปต์ scripts/test/dummy.sh หากมีอยู่)พฤติกรรมทั้งหมดนี้สามารถเปลี่ยนแปลงได้โดยการแก้ไขไฟล์ dispatcher.sh
ก่อนอื่นคุณต้องสร้างผู้ใช้เฉพาะที่จะเรียกใช้ sherver.sh ด้วยสิทธิ์ต่ำ เราจะโทรหาผู้ใช้ sherver ของเราและเราจะใส่เว็บไซต์ทั้งหมดไว้ในไดเรกทอรี Hone
เราจำเป็นต้องเพิ่มผู้ใช้ของเราไปยังกลุ่ม sudo และ netdev ดังนั้นจึงสามารถจัดการ VPN (เห็นได้ชัดว่าไม่ใช่ความคิดที่ดีที่จะให้ sudo แก่ผู้ใช้นี่คือเหตุผลที่คุณไม่ควรเปิดเผยเว็บไซต์บนอินเทอร์เน็ต)
useradd -mUG sudo,netdev -s /usr/bin/bash sherver
passwd sherver
... โปรดทราบว่าคุณสามารถเพิ่มผู้ใช้ปัจจุบันของคุณไปยังกลุ่ม sherver ด้วยเหตุผลในทางปฏิบัติ (คุณจะต้อง relog เพื่อให้มีประสิทธิภาพ):
adduser USER sherverตอนนี้เรามารับเว็บไซต์ในไดเรกทอรีที่บ้าน
su sherver
cd ~
git clone https://github.com/remileduc/sherver.git
cd sherver
git checkout perso ในที่สุดเราจำเป็นต้องเปิดใช้งานบริการดังนั้นมันจะเริ่ม sherver.sh โดยอัตโนมัติ ในการทำเช่นนั้นให้คัดลอกไฟล์ sherver.service ใน /usr/share/systemd/ จากนั้นเปิดใช้งานบริการ:
cp sherver.service /usr/share/systemd/
ln -s /usr/share/systemd/sherver.service /etc/systemd/system/sherver.service
systemctl daemon-reload
systemctl enable sherver.serviceคุณสามารถดูเป็นตัวอย่างสคริปต์ที่ฉันใช้ที่บ้านเพื่อจัดการ VPN ของฉัน สามารถเข้าถึงได้ในสาขา Perso โปรดทราบว่าคุณต้องใช้สคริปต์ VPN-MGR.SH เพื่อให้สามารถใช้งานได้อย่างถูกต้อง
ดู bashttpd เป็นที่ชัดเจนที่จะบอกว่าสิ่งนี้มาโดยไม่มีคุณสมบัติด้านความปลอดภัยใด ๆ อย่าเปิดเผย Sherver บนอินเทอร์เน็ต
หากคุณต้องการเปิดเผยเว็บไซต์บนอินเทอร์เน็ตคุณต้องมีเซิร์ฟเวอร์จริงที่ถูกสร้างขึ้นโดยเฉพาะเพื่อเผชิญกับปัญหาเหล่านี้ทั้งหมด
แม้ว่ามันจะสมบูรณ์แบบในการใช้กับเครือข่ายท้องถิ่น มันจะปลอดภัยเช่นเดียวกับการเชื่อมต่อ WiFi และไฟร์วอลล์ของคุณ
ฉันต้องการตั้งค่าเซิร์ฟเวอร์ที่จะให้บริการหน้าแบบไดนามิกอย่างรวดเร็วและนั่นอาจเรียกใช้สคริปต์ทุบตีบางอย่างเพื่อควบคุมศูนย์สื่อของฉันผ่านหน้าเว็บ
ฉันไม่ต้องการติดตั้งและกำหนดค่า Apache หรือ Nginx อันที่จริงฉันไม่ต้องการการกำหนดค่า ใด ๆ
Sherver สามารถทำงานได้โดยไม่ต้องกำหนดค่าใด ๆ คุณเพียงแค่ต้องเพิ่มไฟล์ในสถานที่ที่เหมาะสม มันสามารถทำงานได้โดยไม่มีสิ่งใดที่จะติดตั้ง (เครื่องมือทั้งหมดที่ใช้เป็นส่วนหนึ่งของการติดตั้งเริ่มต้นของ Debian ยกเว้นบางทีสำหรับ SOCAT)
คุณสามารถเห็นกรณีการใช้งานของฉันใน perso Branche
ทุกอย่างอยู่ภายใต้ใบอนุญาต MIT
เราใช้สคริปต์ mimetype จัดส่งในสคริปต์/utils/mimetype ซึ่งอยู่ภายใต้ใบอนุญาต Perl