เซิร์ฟเวอร์บรรทัดคำสั่ง HTTP แบบง่าย


121

ฉันมีสคริปต์ที่สร้างรายงานรายวันซึ่งฉันต้องการให้บริการแก่สาธารณชนทั่วไปที่เรียกว่า ปัญหาคือฉันไม่ต้องการเพิ่มการบำรุงรักษาอาการปวดหัวของเซิร์ฟเวอร์ HTTP (เช่น Apache) ด้วยการกำหนดค่าทั้งหมดและผลกระทบด้านความปลอดภัย

มีวิธีแก้ปัญหาง่าย ๆ สำหรับการแสดงหน้า HTML ขนาดเล็กเพียงหน้าเดียวโดยไม่ต้องพยายามกำหนดค่าเซิร์ฟเวอร์ HTTP แบบเต็มหรือไม่



2
ทำไมไม่ใช้ netcat?
Dylan

แน่นอน! ใช้ FTP เหมือนที่เวิลด์ไวด์เว็บทำได้ก่อนที่ HTTP จะเสร็จสิ้น! (แม้ว่าฉันคิดว่ามันไม่ได้ค่อนข้างกว้างในต้นปี 1990 😉)
Michael Scheper

1
มีการรวบรวมวิธีการจำนวนมากไว้ในกระทู้
davidcondrey

คำตอบ:



159

ลองSimpleHTTPServer :

python -m SimpleHTTPServer
# or the Python 3 equivalent
python3 -m http.server

มันควรจะทำหน้าที่อะไรก็ตามในCWD (เช่น index.html) ที่http://0.0.0.0:8000


11
python3 -m http.server 1337คุณสามารถเลือกระบุหมายเลขพอร์ตเช่นนี้ คุณไม่สามารถระบุได้ว่าจะผูก IP เท่าที่ฉันจะบอกได้ หมายเหตุ: ในการฟังพอร์ต 80 คุณต้องมีสิทธิ์ใช้งานรูทเช่น:sudo python3 -m http.server 80
Hubro

1
อันนี้ดี แต่มีปัญหากับการเปลี่ยนเส้นทางไปยัง URL ที่มีการเพิ่มเครื่องหมายสแลช นั่นเป็นเหตุผลที่ฉันชอบรุ่น twistd:twistd -n web -p 8000 --path .
Greg Dubicki

--bind <address>ถูกเพิ่มเข้ามาในหลาม 3.4
drewbenn

1
หากต้องการเปลี่ยนพอร์ตการฟังที่เป็นค่าเริ่มต้น 8080 (ด้วย python2) เป็นอย่างอื่นเพียงแค่ใส่หมายเลขพอร์ตหลังจาก:python -m SimpleHTTPServer 3000
Maksim Luzik

44

มีรายการใหญ่ของเซิร์ฟเวอร์ HTTP แบบคงที่หนึ่งสมุทร :

ในการรับรายชื่อนี้ต้องมีวิธีการแก้ไขดังนี้

  1. ให้บริการไฟล์คงที่โดยใช้ไดเรกทอรีปัจจุบันของคุณ (หรือไดเรกทอรีที่ระบุ) เป็นเซิร์ฟเวอร์รูท
  2. สามารถรันด้วยคำสั่งหนึ่งบรรทัดเดียว (การพึ่งพานั้นใช้ได้ถ้าพวกเขาเป็นสิ่งที่ครั้งเดียว)
  3. ให้บริการไฟล์ประเภทพื้นฐาน (html, css, js, images) ที่มีประเภท mime ที่เหมาะสมไม่จำเป็นต้องกำหนดค่า (จากไฟล์หรืออื่น ๆ ) นอกเหนือจากคำสั่งเอง (ไม่มีเซิร์ฟเวอร์เฉพาะเฟรมเวิร์ก ฯลฯ )
  4. ต้องเรียกใช้หรือมีโหมดที่สามารถเรียกใช้ในเบื้องหน้า (เช่นไม่มี daemons)

ตัวอย่างเช่น:

  • บิด (Python)

    twistd -n web -p 8000 --path . 
    
  • เออร์แลง :

    erl -s inets -eval 'inets:start(httpd,[{server_name,"NAME"},{document_root, "."},{server_root, "."},{port, 8000},{mime_types,[{"html","text/html"},{"htm","text/html"},{"js","text/javascript"},{"css","text/css"},{"gif","image/gif"},{"jpg","image/jpeg"},{"jpeg","image/jpeg"},{"png","image/png"}]}]).'
    
  • Plack (Perl)

    cpan Plack
    plackup -MPlack::App::Directory -e 'Plack::App::Directory->new(root=>".");' -p 8000
    
  • webfs

    webfsd -F -p 8000
    
  • ทับทิม 1.9.2+

    ruby -run -ehttpd . -p8000
    

43

ใช้node.jsงานได้รวดเร็วและมีน้ำหนักเบา

หรือ

เพียงใช้ncคำสั่ง netcat แบบง่าย ๆเพื่อเริ่มเว็บเซิร์ฟเวอร์ด่วนบนพอร์ตและให้บริการเนื้อหาของไฟล์รวมถึงส่วนหัวการตอบกลับของเซิร์ฟเวอร์

การอ้างอิงจาก Wikipedia:

http://en.wikipedia.org/wiki/Netcat#Setting_up_a_one-shot_webserver_on_port_8080_to_present_the_content_of_a_file

{ echo -ne "HTTP/1.0 200 OK\r\n\r\n"; cat some.file; } | nc -l -p 8080
{ echo -ne "HTTP/1.0 200 OK\r\nContent-Length: $(wc -c <some.file)\r\n\r\n"; cat some.file; } | nc -l -p 8080

27
กระบวนการ node.js แบบเปลือยที่มีการรันเชลล์แบบโต้ตอบเท่านั้นใช้เวลา 15MB (7.5 ถูกแชร์) ของ RAM จากนั้นคุณต้องเรียกใช้เซิร์ฟเวอร์ HTTP ที่อยู่ภายใน มันเป็นเรื่องตลกที่ผู้คนมองว่ามันเบา ;-)
jpc

ใช่ฉันคิดว่ามันมีน้ำหนักเบาคุณสามารถปรับขนาดได้ด้วยหน่วยความจำที่น้อยลง โปรดอ่านthecodinghumanist.com/blog/archives/2011/5/6/… อย่างไรก็ตามหากคุณพบว่ามันยุ่งยากในการใช้ node.js ยูทิลิตี netcat แบบง่าย ๆ นี้มีจุดประสงค์สั้น ๆ
Nikhil Mulley

1
คุณแน่นอนว่าถ้าคุณเปรียบเทียบโหนดกับ Apache แต่สิ่งที่ฉันพบว่าน่าขบขันคือวิธีที่โหนดดูเมื่อเปรียบเทียบกับcr.yp.to/publicfile.htmlหรือสิ่งที่คล้ายกัน :)
jpc

hmmmmm .. ok ;-)
Nikhil Mulley

8
+1 สำหรับncโซลูชันที่อิง :) โปรดทราบว่าการตั้ง-neค่าสถานะสำหรับechoอาจไม่สามารถพกพาได้การใช้printfคำสั่งแทนอาจเป็นทางเลือกที่ดีกว่า
WhiteWinterWolf

29

ตั้งแต่เวอร์ชัน 5.4.0 PHP ก็มีเว็บเซิร์ฟเวอร์ในตัวด้วย :

php -S localhost:8000

คุณสามารถระบุไดเรกทอรีเอกสารของเว็บเซิร์ฟเวอร์ด้วย-tตัวอย่างเช่น:

php -S localhost:8000 -t /var/lib/www

หากคุณต้องการเข้าถึงเซิร์ฟเวอร์ผ่านเครือข่าย:

php -S 0.0.0.0:8000 -t /var/lib/www

ว้าวนั้นง่ายและเป็นประโยชน์!
Michael-O

อันนี้ดีจริงๆถ้าคุณต้องการทดสอบ php- สคริปต์ในเครื่อง
erik

15

โหนดมีโมดูลเซิร์ฟเวอร์ HTTP ที่ง่ายรวดเร็วและเบา ติดตั้ง:

sudo npm install http-server -g

(สมมติว่าคุณมีnodeและnpmติดตั้งแล้ว.)

หากต้องการเรียกใช้ให้ใช้ไดเรกทอรีปัจจุบันเป็นรูทเว็บไซต์:

http-server

สิ่งนี้จะสร้างเซิร์ฟเวอร์http://0.0.0.0:8080/ขึ้น


มันได้ผล. ฉันมีโปรเจ็กต์ Node บนเครื่อง FreeBSD ฉันแค่รันnpm install -D http-serverในไดเร็กตอรี่โปรเจ็กต์จากนั้นเพิ่มบรรทัดต่อไปนี้ในpackage.jsonไฟล์ของฉัน: "scripts": { "build": "webpack && cd src/public && http-server" },ตอนนี้ฉันแค่ต้องรันnpm run buildบนไดเร็กตอรี่โปรเจ็กต์เพื่อเริ่มเซิร์ฟเวอร์ HTTP
user3405291

2
ครั้งแรกที่ฉันลอง " python3 -m http.server" แต่มันเป็นเธรดเดี่ยวและมีลูกค้าเพียง 1 รายเท่านั้นที่สามารถดาวน์โหลดได้ในแต่ละครั้งลูกค้าอื่น ๆ ต้องรอ โซลูชันนี้กับ Node.js ทำงานได้ดีขึ้นเนื่องจากลักษณะ async ของ Node หากคุณต้องการแชร์ไฟล์กับหลาย ๆ คนให้ใช้สิ่งนี้
Jabba

6

ลองใช้SimpleHTTPServerใน Python

mkdir ~/public_html
command_to_generate_output > ~/public_html/output.txt

(cd ~/public_html; python -c 'import SimpleHTTPServer,BaseHTTPServer; BaseHTTPServer.HTTPServer(("", 8080), SimpleHTTPServer.SimpleHTTPRequestHandler).serve_forever()')

สองบรรทัดแรกมีการตั้งค่าสำหรับเว็บเซิร์ฟเวอร์ บรรทัดสุดท้ายสร้างเว็บเซิร์ฟเวอร์อย่างง่ายที่เปิดบนพอร์ต 8080 ซึ่งให้บริการไฟล์จาก~/public_htmlเท่านั้น หากมีเพียงหนึ่งไฟล์ที่อยู่ในไดเรกทอรีนั้นจะมีเพียงไฟล์ที่เปิดเผยhttp://localhost:8080/output.txtเท่านั้น:


นั่นคือสิ่งที่ฉันใช้เพียงคัดลอกบรรทัดสุดท้ายแล้ววางลงใน.pyไฟล์จากนั้นเรียกใช้ด้วยpython(หรือทำให้สามารถเรียกใช้งานได้) โปรดจำไว้ว่าคุณต้องรันด้วยตัวแปล python 2.x
Hanan N.

3

คุณสามารถย้อนกลับไปที่xinetdได้ วางไฟล์ config ต่อไปนี้ลงใน /etc/xinetd.d/ และบริการ xinetd reload :

service http
{
  flags = REUSE IPv4
  protocol = tcp
  socket_type = stream
  port = 80
  wait = no
  user = nobody
  server = /bin/echo
  server_args = -e HTTP/1.0 301 Moved Permanently\nContent-Length: 0\nLocation: https://goo.gl/\n\n
  disable = no
}

ทำงานเพื่อจุดประสงค์ในการเปลี่ยนเส้นทางของฉัน:

# wget 127.0.0.1
--2016-04-04 22:56:20--  http://127.0.0.1/
Connecting to 127.0.0.1:80... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: https://goo.gl/ [following]
...

2

Oldschool เซิร์ฟเวอร์Ruby WEBrick HTTP:

#!/usr/bin/env ruby

require 'webrick'
server = WEBrick::HTTPServer.new(:Port => 8000,
                                 :DocumentRoot => '~/webrickroot')

# stop server with Ctrl-C
trap('INT') { server.stop }
server.start

ตรวจสอบให้แน่ใจว่าได้ปรับเปลี่ยนการDocumentRootตั้งค่าของคุณ ดูสิ่งนี้ด้วย


2

ตัวเลือกอื่นจะติดตั้ง lighttpd ต่อไปนี้เป็นขั้นตอนที่แนะนำในการติดตั้ง lighttpd บน Unbuntu 12.04 LTS

apt-get update
apt-get upgrade --show-upgraded
apt-get install lighttpd
ifconfig
http://[your-ip-address]:80
/etc/lighttpd/lighttpd.conf (Edit to add server.port)
server.port = "8080"

หมายเหตุ: Documentroot คือที่ที่ทุกไฟล์ที่เข้าถึงได้ทางเว็บจะถูกวาง ที่ตั้งคือ / var / wwww

ขั้นตอนข้างต้นจะติดตั้งเว็บเซิร์ฟเวอร์ lighttpd พื้นฐาน สำหรับข้อมูลเพิ่มเติมอ้างอิงการอ้างอิงต่อไปนี้

อ้างอิง:



2

./devd -o -a -P devd:devd .

  • -o เปิด url ในเบราว์เซอร์
  • -a สำหรับอินเตอร์เฟสทั้งหมด
  • -P ผู้ใช้รับรองความถูกต้อง / ผ่าน
  • . ให้บริการไฟล์ในไดเรกทอรีเดียวกัน

https://github.com/cortesi/devd/releases


2

การแก้ไข / ปรับปรุงอย่างง่าย ๆ สำหรับคำตอบที่ได้รับการโหวตอย่างไม่เป็นธรรมเล็กน้อย (imho) อาจทำงานได้เช่นกัน ลองตั้งค่าไฟล์ html ก่อน ...

echo '<html><head><title>My Test File</title></head><body><hi>OK!</h1></body></html>' > my_file.html

ตอนนี้คุณสามารถให้บริการกับซับนี้:

while true; do echo -e "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n" | cat - my_file.html  | nc -l -p 8080; done

แนวคิดพื้นฐานนี้จะใช้กับเทคนิคอื่น ๆ ที่อาจเป็นประโยชน์กับคุณผ่านcatแนวคิดอื่น ๆหรือ subshell เช่น:

while true; do echo -e "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\nI think the date is $(date), Have a good day!" | nc -l -p 8080; done

0

ตัวอย่าง netcat ง่าย ๆ ที่จะใส่ในสคริปต์ทุบตี:

while true ; do nc -l 80 <index.html ; done 

11
ไม่สามารถพูด HTTP ได้อย่างสมบูรณ์
Derobert

ฉันพยายามwhile [ 1=1 ] ; do echo "TEST" | nc -l 80; done- ไปที่127.0.0.1จะส่งคืนเนื้อหาแน่นอน ฉันต้องทำอย่างนั้นแม้ว่าจะเป็นราก ดังนั้นในทางที่หยาบคายอย่างมาก - สามารถทำงานให้สำเร็จได้ ฉันลองไปที่my-hostnname.localบนเครื่องอื่นใน LAN และใช้งานได้เช่นกัน
unfa

0

SFK คุ้มค่าพูดถึงที่นี่

http://stahlworks.com/dev/swiss-file-knife.html

เครื่องมืออเนกประสงค์ที่ยอดเยี่ยมไม่มีการพึ่งพา

มีให้เลือกทั้งแบบ deb และ rpm

sfk httpserv -port 1234

จะให้บริการไดเรกทอรีปัจจุบัน

sfk httpserv -port 1234 -rw

จะอนุญาตให้อัปโหลดไฟล์


0

ทุบตีเพียว: เว็บเซิร์ฟเวอร์ในสคริปต์เปลือก

นอกจากนี้คุณจะต้อง xinetd (ฉันเชื่อว่ามีให้ใน distro ใด ๆ ) เพื่อฟังพอร์ตและเรียกใช้สคริปต์เมื่อจำเป็นดังนั้นคุณจึงไม่ต้องใช้โค้ด tcp stack ฯลฯ ใน bash



0

ฉันใช้คำแนะนำเหล่านี้เพื่อติดตั้งเว็บเซิร์ฟเวอร์ในเครื่อง CentOS ของฉันโดยไม่ต้องใช้ sudo หรือสัมผัสไฟล์ระบบใด ๆ :

โหนดการติดตั้งครั้งแรก:

$ cd ~
$ wget https://nodejs.org/download/release/latest/node-v8.6.0-linux-x64.tar.gz
$ tar node-v8.6.0-linux-x64.tar.gz

จากนั้นติดตั้ง http-server:

$ export PATH=~/node-v8.6.0-linux-x64/bin:$PATH
$ npm install http-server

จากนั้นรัน http-server บนพอร์ต 12321:

$ ~/node-v8.6.0-linux-x64/bin/node_modules/http-server/bin/http-server -p 12321

0

ฉันได้ปรับปรุงncโซลูชันเล็กน้อยดังนั้น:

  • เพิ่มfilename=คำใบ้
  • วิ่งในวงจนCtrl + C,
  • บันทึก PID เพื่อ/tmp/serveFile-$PORTให้คุณสามารถฆ่ามันในภายหลังได้อย่างง่ายดาย

.

#!/bin/bash

FILE=$1;
if [ "$FILE" == "" ] ; then echo "Usage: $0 <file-to-serve> [<port:7979>]"; exit; fi
PORT=${2:-7979}
echo Serving $FILE at $PORT, PID: $$
echo $$ > /tmp/serveFilePID-$PORT

while true; do 
    { echo -ne "HTTP/1.0 200 OK\r\nContent-Length: $(wc -c <$FILE)\r\nContent-Disposition: inline; filename=\"$(basename $FILE)\"\r\n\r\n"; cat $FILE; } | nc -l $PORT
    CODE=$?
    #echo "Code: $CODE";
    if [ $CODE -gt 128 ] ; then break; fi;
done;

rm /tmp/serveFilePID-$PORT

หนึ่งสามารถใช้nc -k -l ...แต่วิธีนี้คุณสามารถ

  • ทำการกระทำที่กำหนดเองระหว่างไฟล์ที่ให้บริการ
  • ทำให้หลายไฟล์เป็นทางเลือก
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.