Домой Edit me on GitHub

2020-12-05

Каналы передачи данных | Сетевое программирование | Базы данных | Основы Веб-программирования

Встроенный сервер

../_images/reverse_proxy.svg

В некоторых языках, например в Go, уже существует встроенный Веб-сервер, который можно использовать в вашем приложении.

Go FastCGI

В этом случае не нужно запускать отдельно fcgi сервер, например spawn-fcgi.

Примечание

Компиляция go build -o hello.go.fcgi hello.go

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package main

import (
	"fmt"
	"net"
	"net/http"
	"net/http/fcgi"
)

func handler(res http.ResponseWriter, req *http.Request) {
	fmt.Fprint(res, "Hello World!")
}

func main() {
	// For local machine
	// l, _ := net.Listen("unix", "/var/run/go-fcgi.sock")

	l, err := net.Listen("tcp", "0.0.0.0:5000") // TCP 5000 listen
	if err != nil {
		return
	}
	http.HandleFunc("/", handler)
	fcgi.Serve(l, nil)
}

Запуск go fcgi сервера на 5000 порту (Без компиляции).

go run hello.go

Или скомпилированный файл.

./hello.go.fcgi

Настройка Nginx

1
2
3
4
5
6
7
# fcgi.nginx

location /fastcgi_hello {
    # host and port to fastcgi server
    include         fastcgi.conf;
    fastcgi_pass 172.17.0.89:5000;
}
Client Request ----> Nginx (Reverse-Proxy) ----> App. FastCGI Server I. 127.0.0.1:5000

либо с балансировкой на несколько серверов:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# Nginx
upstream myapp1 {
    server 127.0.0.1:5000;
    server 127.0.0.1:5001;
    server 127.0.0.1:5002;
}

server {
    listen 80;

    location /some/path {
        fastcgi_pass http://myapp1;
    }
}
Client Request ----> Nginx (Reverse-Proxy)
                        |
                       /|\
                      | | `-> App. FastCGI Server I.   127.0.0.1:5000
                      |  `--> App. FastCGI Server II.  127.0.0.1:5001
                       `----> App. FastCGI Server III. 127.0.0.1:5002

Go HTTP

Запуск напрямую без CGI и FastCGI.

Примечание

Компиляция go build -o hello.go.http hello.go

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
package main

import (
	"fmt"
	"net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintln(w, "Hello World!")
}

func main() {
	http.HandleFunc("/", handler)
	http.ListenAndServe(":8000", nil)
}

Запуск go http сервера на 8000 порту (Без компиляции).

go run hello.go

Или скомпилированный файл.

./hello.go.http

На такой сервер можно зайти напрямую по адресу http://localhost:8000/, либо настроить обратный прокси сервер:

1
2
3
4
5
# Nginx

location /some/path/ {
    proxy_pass http://127.0.0.1:8000;
}
Client Request ----> Nginx (Reverse-Proxy) ----> App. HTTP Server I. 127.0.0.1:8000

либо с балансировкой на несколько серверов:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# Nginx
upstream myapp1 {
    server 127.0.0.1:8000;
    server 127.0.0.1:8001;
    server 127.0.0.1:8002;
}

server {
    listen 80;

    location /some/path {
        proxy_pass http://myapp1;
    }
}
Client Request ----> Nginx (Reverse-Proxy)
                        |
                       /|\
                      | | `-> App. HTTP Server I.   127.0.0.1:8000
                      |  `--> App. HTTP Server II.  127.0.0.1:8001
                       `----> App. HTTP Server III. 127.0.0.1:8002
Previous: FastCGI Next: WSGI (pep-333)