filehttpd: En webserver til filer i dit filsystem
-
- Indlæg: 5095
- Tilmeldt: 27. apr 2008, 02:16
- IRC nickname: lars_t_h
- Geografisk sted: Fyn
filehttpd: En webserver til filer i dit filsystem
Du kommer til at oversætte programmet (det er nemt), men du skal lige installere en pakke først:
Programmet er udviklet i programmeringssproget Go, og det ser således ud:
Go koden herover er alt hvad der skal til at lave en webserver til filer i filsystemet.
Du kan vælge portnummer med -p argumentet, eller stille dig tilfreds med at den starter op på port 8108.
Med -d argumentet vælger du den mappe som webserveren skal bruge (!BEMÆRK!: at angive et filnavn virker ikke!)
Gem filen og giv den navnet: filehttpd.go
Fra mappen hvor filehttpd.go er i oversættes den med:
Ud kommer et kørbart program der ingen afhængigheder har: filehttpd
Kopier så filen til ~/bin fra mappen hvor filehttpd er i.:
Nu kan du læse HTML filer i filsystemet, og AJAX kald vil også virke, da det jo er en webserver:
Kommandoen serverer filer fra din hjemmemappe, på localhost:8108, så du skal altså kopiere det her ind i din browsers adresselinie for at se det:
/Lars
Edit: ~/.bin -> ~/bin
Kode: Vælg alt
sudo apt-get -y install golang-go
Programmet er udviklet i programmeringssproget Go, og det ser således ud:
Kode: Vælg alt
package main
import (
"flag"
"fmt"
"net/http"
"os"
)
func main() {
var dir string
var port uint
var localhost_port_str string
flag.StringVar(&dir, "d", "", "The path to the directory. "+
"Is equal to the / (Root) dir of the static file web server")
flag.UintVar(&port, "p", 8108, "port number, default value: 8108, only listens on localhost")
flag.Parse()
if dir == "" {
flag.PrintDefaults()
os.Exit(-1)
}
if port > 65535 {
flag.PrintDefaults()
os.Exit(-2)
} else {
localhost_port_str = fmt.Sprintf("localhost:%d", port)
}
http.Handle("/", http.FileServer(http.Dir(dir)))
http.ListenAndServe(localhost_port_str, nil)
}
Go koden herover er alt hvad der skal til at lave en webserver til filer i filsystemet.
Du kan vælge portnummer med -p argumentet, eller stille dig tilfreds med at den starter op på port 8108.
Med -d argumentet vælger du den mappe som webserveren skal bruge (!BEMÆRK!: at angive et filnavn virker ikke!)
Gem filen og giv den navnet: filehttpd.go
Fra mappen hvor filehttpd.go er i oversættes den med:
Kode: Vælg alt
go build ./filehttpd.go
Ud kommer et kørbart program der ingen afhængigheder har: filehttpd
Kopier så filen til ~/bin fra mappen hvor filehttpd er i.:
Kode: Vælg alt
mkdir -p ~/bin;mv ./filehttpd ~/bin/filehttpd; chmod ugo+x ~/bin/filehttpd
Nu kan du læse HTML filer i filsystemet, og AJAX kald vil også virke, da det jo er en webserver:
Kode: Vælg alt
filehttpd -d="$HOME"
Kommandoen serverer filer fra din hjemmemappe, på localhost:8108, så du skal altså kopiere det her ind i din browsers adresselinie for at se det:
Kode: Vælg alt
http://localhost:8108
/Lars
Edit: ~/.bin -> ~/bin
Senest rettet af lath 13. okt 2014, 02:17, rettet i alt 3 gange.
Jeg er Software ingeniør (Diplomingeniør) i Informationsteknologi og indlejede systemer, hvor indlejrede systemer er computer (microcontroller) + elektronik i for eksempel et TV, en router, en vaskemaskine og den slags
-
- Admin
- Indlæg: 20860
- Tilmeldt: 15. nov 2009, 15:04
- IRC nickname: AJenbo
- Geografisk sted: Vanløse, København
Re: filehttpd: En webserver til filer i dit filsystem
Helt uden afhængiheder er den vel ikke for den kræver både Linux og Libc. Men den løser det jo ved at lave fat-bineries hvilket betyder at programmerne vil bruge mere ram end nødvendigt da de ikke kan dele hukommelsen hvilket jeg syndes er lidt ærgerligt. Det må vel også betyde et ydelses tab når der oftere skal skiftes ud mellem ram og CPU cache.
-
- Redaktør
- Indlæg: 4430
- Tilmeldt: 6. jan 2009, 22:01
- Geografisk sted: København
Re: filehttpd: En webserver til filer i dit filsystem
Sejt. Meget enkelt.
Der er en fejl i linjen hvor du opretter en mappe, flytter en fil og sætter rettigheder:
Hvis det er meningen det skal være en bin mappe under den mappe man befinder sig i, så mangler chmod delen et punktum. Hvis det derimod er meningen at der der oprettes en mappe under /home/username (~/), så er der et punktum i overskud i mkdir og mv ~/bin/filehttpd kommandoerne. Ud over det fungerer det strålende.
Der er en fejl i linjen hvor du opretter en mappe, flytter en fil og sætter rettigheder:
Kode: Vælg alt
mkdir -p ~./bin;mv ./filehttpd ~./bin/filehttpd; chmod ugo+x ~/bin/filehttpd
Hvis det er meningen det skal være en bin mappe under den mappe man befinder sig i, så mangler chmod delen et punktum. Hvis det derimod er meningen at der der oprettes en mappe under /home/username (~/), så er der et punktum i overskud i mkdir og mv ~/bin/filehttpd kommandoerne. Ud over det fungerer det strålende.
-
- Indlæg: 5095
- Tilmeldt: 27. apr 2008, 02:16
- IRC nickname: lars_t_h
- Geografisk sted: Fyn
Re: filehttpd: En webserver til filer i dit filsystem
AJenbo skrev:Helt uden afhængiheder er den vel ikke for den kræver både Linux og Libc.
Alle programmer kræver sjovt nok en kerne, så det er da rigtigt at Linux er påkrævet for Linux styresystemer før Go programmet (og alle andre programmer) overhovedet kan starte.
Med hensyn til libc må det have noget at gøre med net/http pakken (den bruger cgo), fordi Go laver normalt kun programmer med absolut ingen afhængigheder:
Fra Go FAQ https://golang.org/doc/faq#Why_is_my_trivial_program_such_a_large_binary har vi:
The linkers in the gc tool chain (5l, 6l, and 8l) do static linking. ...
AJenbo skrev:Men den løser det jo ved at lave fat-bineries hvilket betyder at programmerne vil bruge mere ram end nødvendigt da de ikke kan dele hukommelsen hvilket jeg syndes er lidt ærgerligt. Det må vel også betyde et ydelses tab når der oftere skal skiftes ud mellem ram og CPU cache.
Jeg kan nævne at programmet er fyldt med debugging symboler, og kører man stripe på objekt-koden (ikke program-filen) før programmet linkes til et program, så kan det reduceres meget i størrelse.
Nu kører der jo ofte kun en instans af programmet for servere, så RAM spild er der ikke så meget af, og din bekymring med ydelsestab er så ikke korrekt for kun 1 instans af serveren.
Google har dog planer om fuld support for Go shared libraries - også at et Go runtime kan embeddes inde i et andet program, som et shared library, såvel som brug af dynamisk linking ved runtime.
Det er absolut en fordel at lave en static linked binary for servere.
Deployment bliver super-nemt: 1) kopier til serveren med scp 2) start den. Der findes også tricks til automatisk blød opstart af Go servere uden at brugerne opdager noget, så trin 2 kan være udnødvendigt.
Tricket går ud på at overtage indkommende trafik fra den gamle version af serveren, og så lade klienter stadig være aktive for den gamle version af serveren, såvel som at acceptere nye indkomne requests for den nye version af serveren.
Den gamle version af serveren lukker så ned når sidste klient ikke længere har brug for serveren, evt .tilføjes en timeout for at serveren ikke hænger i RAM i al evighed.
Klient koden - javascript - kan laves sådan at den kan modtage en meddelelse om at serveren ønsker at klienten skal lukke den nuværende websocket ned og oprette en ny websocket forbindelse til serveren. For at undgå thundering hurd problemet indsætter man så en lille pause i hver anmodning til en klient om at reconnecte.
/Lars
Jeg er Software ingeniør (Diplomingeniør) i Informationsteknologi og indlejede systemer, hvor indlejrede systemer er computer (microcontroller) + elektronik i for eksempel et TV, en router, en vaskemaskine og den slags
-
- Indlæg: 5095
- Tilmeldt: 27. apr 2008, 02:16
- IRC nickname: lars_t_h
- Geografisk sted: Fyn
Re: filehttpd: En webserver til filer i dit filsystem
zob skrev:Sejt. Meget enkelt.
Der er en fejl i linjen hvor du opretter en mappe, flytter en fil og sætter rettigheder:Kode: Vælg alt
mkdir -p ~./bin;mv ./filehttpd ~./bin/filehttpd; chmod ugo+x ~/bin/filehttpd
Hvis det er meningen det skal være en bin mappe under den mappe man befinder sig i, så mangler chmod delen et punktum. Hvis det derimod er meningen at der der oprettes en mappe under /home/username (~/), så er der et punktum i overskud i mkdir og mv ~/bin/filehttpd kommandoerne. Ud over det fungerer det strålende.
Godt spottet - fejlen er rettet nu.
/Lars
Jeg er Software ingeniør (Diplomingeniør) i Informationsteknologi og indlejede systemer, hvor indlejrede systemer er computer (microcontroller) + elektronik i for eksempel et TV, en router, en vaskemaskine og den slags
-
- Admin
- Indlæg: 20860
- Tilmeldt: 15. nov 2009, 15:04
- IRC nickname: AJenbo
- Geografisk sted: Vanløse, København
Re: filehttpd: En webserver til filer i dit filsystem
lath skrev:Nu kører der jo ofte kun en instans af programmet for servere, så RAM spild er der ikke så meget af, og din bekymring med ydelsestab er så ikke korrekt for kun 1 instans af serveren.
Tjo, men måske ville man køre flere programmer hvor der kunne være en fordel at dele elementer af programmerne. Også mere generelt kunne det være en fordel hvis nu ikke lige man køre på en server med kun en funktion.
-
- Indlæg: 2667
- Tilmeldt: 21. nov 2006, 10:06
- Geografisk sted: Fredericia
Re: filehttpd: En webserver til filer i dit filsystem
Kan andre computere på netværket også tilgå ens filstruktur ved at anvende IP:8108 - som f.eks. ved XAMPP?
Forfatter til Ubuntuguiden: http://www.vidas.dk/guides/ubuntuguiden.html
Kører LTS udgaverne.
"It's always easy if you know how to do it."
Kører LTS udgaverne.
"It's always easy if you know how to do it."
-
- Admin
- Indlæg: 20860
- Tilmeldt: 15. nov 2009, 15:04
- IRC nickname: AJenbo
- Geografisk sted: Vanløse, København
-
- Indlæg: 2667
- Tilmeldt: 21. nov 2006, 10:06
- Geografisk sted: Fredericia
Re: filehttpd: En webserver til filer i dit filsystem
Det mener jeg jo så skal nævnes som en konsekvens sideeffekt. For når man så logger på netværket på f.eks. arbejde/skole osv - så får andre også adgang .....
uagtet at det er supercool at man kan gg
uagtet at det er supercool at man kan gg
Forfatter til Ubuntuguiden: http://www.vidas.dk/guides/ubuntuguiden.html
Kører LTS udgaverne.
"It's always easy if you know how to do it."
Kører LTS udgaverne.
"It's always easy if you know how to do it."
-
- Indlæg: 5095
- Tilmeldt: 27. apr 2008, 02:16
- IRC nickname: lars_t_h
- Geografisk sted: Fyn
Re: filehttpd: En webserver til filer i dit filsystem
thj01 skrev:Det mener jeg jo så skal nævnes som en konsekvens sideeffekt. For når man så logger på netværket på f.eks. arbejde/skole osv - så får andre også adgang .....
uagtet at det er supercool at man kan gg
I kildekoden står der localhost, hvilket er IP adressen 127.0.0.1, som kun er tilgængeligt fra programmer på maskinen der kører filehttpd.
Dermed er der ikke mulighed for adgang fra nogen hosts i et netværk.
Fjerner man localhost i kildekoden (det gøres i fomatteringsteksten til fmt.Sprintf) vil den derimod lytte på alle netværksinterfaces.
Man kan også oprette en ny bruger der hedder filehttpd for eksempel, og så starte filehttpd programmet som om det var den bruger.
Det gøres med:
Kode: Vælg alt
su filehttpd -c filehttpd <argumenter til filehttpd>
(kodeordet du skal indtaste er det for bruger filehttpd - ikke dit eget kodeord)
Teksten herunder er for alle andre brugerkonti end filehttpd brugerkontoen (*)
Hvis der bruges et andet brugernanv end dit eget til at starte filehttpd programmet, så vilrettigheder styre hvad der kan kigges på.
Det bliver så sådan at der kan kigges på en fil, hvis read-bitten for other er sat, dvs at hvis man kører chmod o+r på en fil kan den læses. Har man derimod kørt o-r på en fil kan den ikke læses.
Bemærk at for mapper skal x-bitten sættes for at man kan se indholdet.
/Lars
(*): Pas på med hvilke grupper filehttpd brugeren er medlem af, for eller kan der være adgang alligevel.
Jeg er Software ingeniør (Diplomingeniør) i Informationsteknologi og indlejede systemer, hvor indlejrede systemer er computer (microcontroller) + elektronik i for eksempel et TV, en router, en vaskemaskine og den slags
-
- Indlæg: 5095
- Tilmeldt: 27. apr 2008, 02:16
- IRC nickname: lars_t_h
- Geografisk sted: Fyn
Re: filehttpd: En webserver til filer i dit filsystem
Jeg brøvede lige at køre stripe på programmet før det skrives til filsystemet.
Det gør man sådan her:
Ud kommer en filehttpd som nu er stripped for debugging symboler, hvilket reducerer filstørrelsen med lige under 28% (27,99%) for filehttpds vedkommende.
Dvs at filehttpd:
Det sjove er at programmet kun tog mig ca 10 minutter at lave, og at filehttpd kan klare flere samtidige forbindelser - sådan bare uden videre.
/Lars
Det gør man sådan her:
Kode: Vælg alt
go build -ldflags "-s" filehttpd.go
Ud kommer en filehttpd som nu er stripped for debugging symboler, hvilket reducerer filstørrelsen med lige under 28% (27,99%) for filehttpds vedkommende.
Dvs at filehttpd:
- med debugging symboler fylder 4.236.320 bytes (4,04 MiB)
- uden debugging symboler fylder 5.883.760 bytes (5,61 MiB)
Det sjove er at programmet kun tog mig ca 10 minutter at lave, og at filehttpd kan klare flere samtidige forbindelser - sådan bare uden videre.
/Lars
Jeg er Software ingeniør (Diplomingeniør) i Informationsteknologi og indlejede systemer, hvor indlejrede systemer er computer (microcontroller) + elektronik i for eksempel et TV, en router, en vaskemaskine og den slags
-
- Admin
- Indlæg: 20860
- Tilmeldt: 15. nov 2009, 15:04
- IRC nickname: AJenbo
- Geografisk sted: Vanløse, København
Re: filehttpd: En webserver til filer i dit filsystem
Er det muligt at compile det på en måde hvor den ikke statisk linker alle libs? Jeg kan se den både linker med et TLS crypto og gzip komprimerings lib selv om det ikke rigtig er i brug.
-
- Indlæg: 5095
- Tilmeldt: 27. apr 2008, 02:16
- IRC nickname: lars_t_h
- Geografisk sted: Fyn
Re: filehttpd: En webserver til filer i dit filsystem
AJenbo skrev:Er det muligt at compile det på en måde hvor den ikke statisk linker alle libs? Jeg kan se den både linker med et TLS crypto og gzip komprimerings lib selv om det ikke rigtig er i brug.
Almindeligvis kan man som programmør selv bestemme om nogle libs skal statisk lænkes og andre dynamisk lænkes.
net/http pakken understøtter https, så det er nok derfor at den linker til en TLS crypto lib.
net/http pakken har såvidt jeg husker det en reference til gzip pg zlib pakkerne, så det er nok derfor at den er med.
Jeg mener godt at man kan dynamisk linke Go programmer. Det er bare ikke sådan noget man bare lige gør, og da jeg ikke har det behov, så det er uinteressant for mig.
/Lars
Jeg er Software ingeniør (Diplomingeniør) i Informationsteknologi og indlejede systemer, hvor indlejrede systemer er computer (microcontroller) + elektronik i for eksempel et TV, en router, en vaskemaskine og den slags
Tilbage til "Guides og HowTo's"
Hvem er online
Brugere der læser dette forum: Ingen og 0 gæster