ภาพรวมผลิตภัณฑ์
เซิร์ฟเวอร์หนึ่งตัวระหว่างเครือข่ายและแอปพลิเคชันของคุณ
Webship เป็น Rust ขอบเขตที่โฮสต์ด้วยตนเองและเซิร์ฟเวอร์เว็บสแตติก หนึ่งรันไทม์ยุติโปรโตคอลสมัยใหม่ ใช้นโยบายขอบเขต ให้บริการไฟล์ และโปรกซีคำขอแอปพลิเคชัน
การขนส่งสมัยใหม่
ยอมรับ HTTP/1.1, HTTP/2, และ HTTP/3, พร้อมกับ TLS 1.3 และจุดปลายทาง WebTransport ทางเลือก
การจัดส่งแบบคงที่และแบบพร็อกซี
ให้บริการไฟล์สถิติด้วยตัวตรวจสอบและตัวเสริมที่บีบอัดล่วงหน้า หรือพร็อกซี่การจราจรของแอปพลิเคชันผ่านกลุ่มต้นน้ำที่จำกัด
ค่าเริ่มต้นที่ปลอดภัย
เริ่มต้นด้วย WAF, การควบคุม DDoS, การทดสอบบ็อต, เฮดเดอร์ความปลอดภัยของการตอบสนอง, API Shield, และการป้องกันไฟล์จุดที่เปิดใช้งาน
การดำเนินงานที่สามารถสังเกตได้
ใช้สถิติที่ยืนยันแล้ว, เมตริกของ Prometheus, รหัสคำขอ, การรีโหลดอย่างนุ่มนวล, และแผงควบคุม MCP ทางเลือก
เริ่มต้นอย่างรวดเร็ว
จากไบนารีเวอร์ชันที่ปล่อยไปสู่ผู้ฟังที่ทำงานปกติ
เริ่มต้นบน loopback, ตรวจสอบทุกอย่างก่อนผูก, และยืนยันการตอบกลับสุขภาพในตัวก่อนเพิ่มทราฟฟิกสาธารณะ
เตรียมไฟล์
วางไฟล์ไบนารีสำหรับการปล่อย, ไฟล์การตั้งค่า TOML, รากสถิติคงที่ และไฟล์ใบรับรอง TLS และคีย์ที่ตั้งค่าไว้ใด ๆ บนโฮสต์
ตรวจสอบและตรวจสอบ
เรียกใช้คำสั่งการตั้งค่าทั้งคู่ แก้ไขข้อผิดพลาดแรกและตรวจสอบผลลัพธ์ที่แก้ไขแล้วก่อนเริ่มต้น
เริ่มใช้งานแบบส่วนตัว
เริ่ม Webship ด้วยไฟล์ TOML ที่เลือก ใส่คู่ใบรับรองครบถ้วนหรือ TLS อัตโนมัติเมื่อไซต์พร้อมสำหรับการจราจรสาธารณะที่ปลอดภัย
ตรวจสอบ runtime
เรียก GET /health ภายในเครื่อง จากนั้นทดสอบเส้นทางคงที่, TLS, เส้นทางพร็อกซี่, กฎความปลอดภัย และการตรวจสอบที่ต้องมีการยืนยันตัวตน
listen = "127.0.0.1:4433"
workers = 4
root = "./public"/usr/local/bin/webship --check-config --config /etc/webship/production.toml
/usr/local/bin/webship --print-effective-config --config /etc/webship/production.toml/usr/local/bin/webship --config /etc/webship/production.toml
curl --http3-only --insecure https://127.0.0.1:4433/healthคู่มือเริ่มต้นด่วนสำหรับตัวแทน AI
เชื่อมต่อเอเจนต์ AI กับ Webship ในห้าบรรทัด
เชื่อมต่อ Claude Code, OpenAI, DeepSeek, หรือไคลเอนต์ MCP ที่เข้ากันได้ผ่านช่องทาง SSH ส่วนตัว ตัวแทนจะได้รับพื้นผิวการดำเนินการที่ได้รับการตรวจสอบสิทธิ์โดยไม่ต้องแชร์ตัวฟังสาธารณะหรือเปิดเผยข้อมูลการควบคุมต่อการจราจรอินเทอร์เน็ต
{
"mcpServers": {
"webship": { "url": "https://localhost:19443/mcp",
"headers": { "Authorization": "Bearer <token>" } }
} }การส่งแบบคงที่
ให้บริการไดเรกทอรีด้วยค่าเริ่มต้นที่รับรู้โปรโตคอล
ตั้งค่า root ทั้งแบบทั่วโลกหรือเฉพาะแต่ละไซต์. ไซต์ TLS จะใช้ HTTP/3 เป็นค่าเริ่มต้นเท่านั้น; เว็บไซต์ที่ใช้ข้อความชัดเจนจะใช้ HTTP/1.1 และ H2C เป็นค่าเริ่มต้น. สามารถตั้งค่า HTTP/1.1, HTTP/2, และ HTTP/3 แยกกันสำหรับแต่ละไซต์ได้
[[sites]]
domain = "app.example.com"
root = "/srv/app"
listen = "0.0.0.0:443"
[sites.protocols]
h1 = true
h2 = true
h3 = trueเราเตอร์ในตัวรองรับ GET และ HEAD, ช่วงไบต์, คำร้องขอตามเงื่อนไข, ตัวตรวจสอบ, และไฟล์เสริม .br, .zst, และ .gz โดยค่าเริ่มต้นเส้นทางไฟล์จุด (dot-file) จะถูกปฏิเสธ; .well-known ยังคงสามารถใช้งานได้
ทราฟฟิกของแอปพลิเคชัน
เส้นทางคำขอไปยังอัพสตรีมหนึ่งหรือมากกว่า
เปิดใช้การทำรีเวิร์สพร็อกซี่, จับคู่โฮสต์และเส้นทาง จากนั้นกำหนดนโยบายสุดท้ายที่ไม่มีเงื่อนไข Webship รองรับพูลที่จำกัด, การตรวจสอบสุขภาพ, การปรับสมดุลโหลด, เบรกเกอร์วงจร, การลองอีกครั้งแบบไม่มีเนื้อหาปลอดภัย, WebSockets, และการแคช
[reverse_proxy]
enabled = true
[[reverse_proxy.routes]]
domain = "app.example.com"
path_prefix = "/api"
strip_path_prefix = true
upstreams = ["127.0.0.1:8080", "127.0.0.1:8081"]
[[reverse_proxy.policies]]
name = "default"
hosts = []
path_prefixes = ["/"]
methods = []
max_body_bytes = 1048576
total_timeout_ms = 30000Webship 1.5.0 เลเยอร์ 4
พร็อกซี่การรับส่งข้อมูล TCP และ UDP โดยไม่ต้องมีเส้นทาง HTTP
เลเยอร์ 4 ถูกปิดใช้งานโดยค่าเริ่มต้น กำหนด upstreams ที่มีชื่อ นโยบาย TCP และ UDP อิสระ ตัวฟัง และเส้นทาง TCP รองรับการจำกัดการเชื่อมต่อ การตรวจสุขภาพ การกระจายโหลด โปรโตคอล PROXY แบบเลือกได้ และการส่งผ่าน TLS หรือการยุติ TLS UDP ใช้การไหลที่จำกัดและพนักงานรับข้อมูลแบบแบตช์
[layer4]
enabled = true
[[layer4.tcp_policies]]
name = "edge-tcp"
max_connections = 10000
idle_timeout_ms = 300000
[[layer4.udp_policies]]
name = "edge-udp"
max_flows = 20000
receive_batch_size = 32
[[layer4.upstreams]]
name = "origin-a"
address = "127.0.0.1:9443"
weight = 100
[[layer4.tcp]]
name = "tls-tunnel"
listen = "127.0.0.1:10443"
policy = "edge-tcp"
tls_mode = "passthrough"
[[layer4.tcp.routes]]
name = "default"
default = true
upstreams = ["origin-a"]
load_balancing = "weighted-peak-ewma"
[[layer4.udp]]
name = "datagrams"
listen = "127.0.0.1:10443"
policy = "edge-udp"
[[layer4.udp.routes]]
name = "default"
default = true
upstreams = ["origin-a"]การส่งผ่านตามเส้นทาง
สร้างแคชแบบสไตล์ CDN ที่จำกัดโดยไม่ข้ามขอบเขตของไซต์
แคชถูกกำหนดค่าบนแต่ละเส้นทางพร็อกซีย้อนกลับ ไม่ใช่ทั่วทั้งระบบ เลือกวิธีการและสถานะที่ปลอดภัย ขอบเขตเวลา TTL พฤติกรรม CDN-Cache-Control และการปรับมาตรฐานคีย์คิวรีสำหรับไซต์และเส้นทางนั้น ๆ คำตอบที่มีการพิสูจน์ตัวตน เป็นส่วนบุคคล แบบส่วนตัว และไม่เก็บ จะไม่สามารถแคชได้โดยค่าเริ่มต้น
[[reverse_proxy.routes]]
domain = "assets.example.com"
path_prefix = "/assets"
upstreams = ["127.0.0.1:8080"]
[reverse_proxy.routes.cache]
enabled = true
cacheable_methods = ["GET", "HEAD", "QUERY"]
cacheable_statuses = [200, 203, 204, 206, 301, 404, 410]
default_ttl_ms = 60000
max_ttl_ms = 86400000
honor_cdn_cache_control = true
query_mode = "ignore-listed"
ignored_query_parameters = ["utm_*", "fbclid"]บริบทการจราจรภายในเครื่อง
ใช้กฎ GeoIP โดยไม่ต้องใช้บริการค้นหาที่โฮสต์
โหลดข้อมูลประเทศ เมือง และ ASN จากฐานข้อมูลที่เข้ากันได้กับ MaxMind ภายในเครื่อง GeoIP ถูกปิดใช้งานเป็นค่าเริ่มต้น; ควรรักษาไฟล์ฐานข้อมูลให้ทันสมัยและตัดสินใจว่าความล้มเหลวของการค้นหาควรปฏิเสธหรือข้ามนโยบายที่ขึ้นกับภูมิศาสตร์ก่อนเปิดใช้งาน
[geoip]
enabled = true
country_db = "/var/lib/webship/geo/country.mmdb"
city_db = "/var/lib/webship/geo/city.mmdb"
asn_db = "/var/lib/webship/geo/asn.mmdb"
failure_mode = "deny"โปรโตคอลอีเมล
กำหนดเส้นทางเซสชันอีเมลด้วยการควบคุมที่ทราบโปรโตคอล
ใช้ระนาบข้อมูลอีเมลแยกต่างหากสำหรับการส่ง SMTP, IMAP, POP3 และการกำหนดเส้นทางที่ทราบโปรโตคอลที่เกี่ยวข้อง ผู้ฟังสามารถใช้การส่งผ่าน, TLS แบบนิ่ง หรือการอัปเกรด STARTTLS แบบจำกัด เก็บผู้ฟังใหม่บน loopback จนกว่าจะตรวจสอบตัวตนอัปสตรีม, ใบรับรอง, การตรวจสอบสิทธิ์ และนโยบาย TLS แล้ว
[mail]
enabled = true
[[mail.upstreams]]
name = "submission-a"
address = "127.0.0.1:2465"
protocol = "smtp-submission"
security = "plain"
[[mail.listeners]]
name = "submissions"
listen = "127.0.0.1:1465"
protocol = "smtp-submission"
client_security = "passthrough"
upstreams = ["submission-a"]
load_balancing = "weighted-least-requests"TLS และ HTTP/3
ใช้ใบรับรองด้วยตนเองหรือปล่อยให้ Webship จัดการ
ตั้งแต่ Webship 1.4.0 แต่ละไซต์สามารถเลือกโหมดใบรับรองของตนเองได้อย่างอิสระ HTTP/3 ใช้ตัวฟัง UDP ที่ตรงกัน; เปิด HTTP/1.1 หรือ HTTP/2 เมื่อไซต์ TLS 1.3 เดียวกันยังต้องการความเข้ากันได้กับ TCP
listen = "0.0.0.0:443"
[automatic_tls]
enabled = true
directory_url = "https://acme-v02.api.letsencrypt.org/directory"
cache_dir = "/var/lib/webship/acme"
contacts = ["mailto:ops@example.com"]
accept_terms_of_service = true
[[sites]]
domain = "app.example.com"
root = "/srv/app"
certificate_mode = "per_site" # default public ACME certificate
[[sites]]
domain = "legacy.example.com"
root = "/srv/legacy"
certificate_mode = "shared" # legacy public multi-SAN certificateสถาปัตยกรรมใบรับรองต่อไซต์
เลือกความน่าเชื่อถือของใบรับรองและขนาดได้อย่างอิสระสำหรับแต่ละไซต์
Webship 1.4.0 ย้าย certificate_mode ไปยังแต่ละรายการ [[sites]] ACME ต่อไซต์สาธารณะ, fleet shards DNS-01 สาธารณะ, CA ส่วนตัวในตัว, ใบรับรองแชร์แบบเก่า, และไฟล์ใบรับรองด้วยตนเองสามารถอยู่ร่วมกันในกระบวนการที่เป็นเอกเทศเดียว
ต่อเว็บไซต์ — ใบรับรองสาธารณะ
ค่าเริ่มต้น สั่งซื้อใบรับรอง ACME สาธารณะที่เชื่อถือโดยเบราว์เซอร์หนึ่งใบสำหรับชื่อไซต์ที่ตรงกันโดยใช้ TLS-ALPN-01
กองเรือ — ชิ้นส่วน DNS-01 สาธารณะ
ใช้การออกใบรับรอง DNS-01 สาธารณะสำหรับชื่อหลายระดับที่สามและระดับที่สี่ภายใต้โดเมนที่จดทะเบียนอย่างชัดเจน ชื่อยังคงอยู่ในชิ้นส่วนใบรับรองแบบกลุ่มที่เสถียร
ฝังตัว — CA ส่วนตัว
ออกใบรับรองแยกต่างหากภายในกระบวนการจาก CA ส่วนตัวของ Webship ไม่จำเป็นต้องมีบัญชี ACME สาธารณะ การท้าทาย DNS การรวมกับผู้จดทะเบียน หรือพอร์ตขาเข้า 443
แชร์ — multi-SAN แบบเก่า
เก็บกลุ่ม multi-SAN สาธารณะเดิมสำหรับการปรับใช้ที่ต้องการ สิ่งนี้ไม่ใช่ค่าเริ่มต้นและยังคงอยู่ภายใต้ข้อจำกัดตัวระบุของ CA สาธารณะ
[automatic_tls]
enabled = true
directory_url = "https://acme-v02.api.letsencrypt.org/directory"
cache_dir = "/var/lib/webship/acme"
contacts = ["mailto:ops@example.com"]
accept_terms_of_service = true
[automatic_tls.fleet]
shard_size = 64
batch_window_ms = 300000
weekly_certificate_limit = 50
emergency_certificate_reserve = 5
registered_domains = ["example.com"]
[automatic_tls.fleet.dns]
listen = "0.0.0.0:53"
nameservers = ["ns1.example.net"]
addresses = ["192.0.2.10"]
propagation_timeout_ms = 120000
resolver_url = "https://dns.google/resolve"
challenge_ttl_seconds = 900
[[sites]]
domain = "app.example.com"
root = "/srv/app"
certificate_mode = "fleet"
[[sites]]
domain = "media.app.example.com"
root = "/srv/media"
certificate_mode = "fleet"[automatic_tls]
enabled = true
cache_dir = "/var/lib/webship/acme"
[acme_ca]
state_dir = "/var/lib/webship/acme-ca"
leaf_validity_days = 90
[[sites]]
domain = "internal.example.com"
root = "/srv/internal"
certificate_mode = "embedded"นโยบายขอบ
รักษามาตรฐานความปลอดภัยให้คงอยู่
Webship เปิดใช้งานชั้นป้องกันหลักโดยค่าเริ่มต้น ปรับขีดจำกัดให้เหมาะสมกับภาระงานของคุณและตรวจสอบความถูกต้องหลังจากที่มีการเปลี่ยนแปลงกฎหรือ header-policy ทุกครั้ง
[ddos]
enabled = true
mode = "normal"
requests_per_minute = 600
burst = 100
block_seconds = 300
[security.response_headers]
enabled = true
nosniff = true
frame_deny = true
referrer_no_referrer = true
hsts = "max-age=31536000; includeSubDomains"
content_security_policy = "default-src 'self'; frame-ancestors 'none'"ใช้โหมดปกติสำหรับการจราจรปกติ, under_attack สำหรับจัดการการโจมตีแบบเข้มงวดกว่า, และ lockdown เมื่ออนุญาตเฉพาะการตรวจสอบและเส้นทางที่ได้รับอนุญาตเท่านั้น
การวินิจฉัยส่วนตัว
ตรวจสอบขอบเขตโดยไม่ต้องเปิดเผยแผงควบคุม
สถิติและเมตริกของ Prometheus จะรันบนผู้ฟังที่ต้องพิสูจน์ตัวตนแยกต่างหาก ต้องเปิดใช้งานการประเมินผลทุกครั้งที่ปลายทางใด ๆ ทำงาน
[observability]
instrumentation = true
stats = true
metrics = true
listen = "127.0.0.1:9090"
token = "replace-with-at-least-32-random-printable-ascii-characters"การดำเนินงานอย่างปลอดภัย
โหลดใหม่โดยตั้งใจ เก็บการย้อนกลับใกล้มือ
โหลดการกำหนดค่าใหม่
ส่ง SIGHUP หลังจากแก้ไขการกำหนดค่าที่มีไฟล์สำรอง Webship จะตรวจสอบความถูกต้องของการแทนที่ก่อนติดตั้งและเก็บการกำหนดค่าที่กำลังทำงานไว้เมื่อการตรวจสอบล้มเหลว
อัปเกรดและย้อนกลับ
ติดตั้งไบนารีใหม่ข้างเวอร์ชันก่อนหน้า ตรวจสอบการกำหนดค่าการผลิตด้วยมัน จากนั้นตรวจสอบสุขภาพ TLS การทำงานเป็นพร็อกซี่ และเมตริก รักษาไบนารีก่อนหน้าจนกว่าทุกด่านจะผ่าน
kill -HUP "$(pidof webship)"
/usr/local/bin/webship update --config /etc/webship/production.toml
sudo systemctl daemon-reload
sudo systemctl enable --now webship
sudo systemctl status webshipการเพิ่มประสิทธิภาพโดยใช้โปรไฟล์
รวบรวมโปรไฟล์ของเป้าหมาย-เนทีฟโดยไม่ทำให้สับสนระหว่างการฝึกอบรมกับการผลิต
ทุก Webship 1.5.0 เป้าหมายมี CLI ที่ติดตั้งแยกต่างหากสำหรับเก็บข้อมูล LLVM โปรไฟล์เฉพาะเป้าหมายภายใต้การจราจรตัวแทนของคุณ ใช้เวอร์ชันและทริปเปิลเป้าหมายที่ถูกต้อง ฝึกเส้นทางและโปรโตคอลที่สำคัญ และหยุดกระบวนการอย่างเหมาะสมเพื่อให้สามารถเขียนไฟล์ .profraw ทุกไฟล์ออกมา
เลือกเป้าหมายที่ต้องการอย่างแม่นยำ
ดาวน์โหลด CLI การฝึก PGO ที่เวอร์ชันการปล่อยและตัวยก Rust ตรงกับรันไทม์ที่คุณตั้งใจจะปรับแต่ง ตรวจสอบ SHA-256 ที่เผยแพร่ก่อน
จับภาพทราฟฟิกตัวแทน
ตั้งค่า LLVM_PROFILE_FILE ไปที่ไดเรกทอรีที่สามารถเขียนได้, เริ่ม CLI การฝึกด้วยสำเนาการกำหนดค่าจริงที่ตรวจสอบแล้ว, เล่นซ้ำการจราจรแบบตรงและผ่านพร็อกซีกลับที่เป็นตัวแทน, จากนั้นหยุด Webship อย่างเรียบร้อย
รวมโปรไฟล์ดิบ
ใช้ llvm-profdata จากคอมไพเลอร์ที่สร้างสำหรับการเผยแพร่ รวมไฟล์ .profraw ทุกไฟล์ที่สร้างออกมาเป็นไฟล์ sparse webship.profdata ไฟล์เดียว
สร้างใหม่และตรวจสอบเกท
ใช้โปรไฟล์ที่รวมแล้วกับซอร์สโค้ด, คอมไพเลอร์, ผู้ให้บริการการเข้ารหัส, ชุดฟีเจอร์, และเป้าหมายที่สร้างมันเท่านั้น รันเกทความถูกต้องและประสิทธิภาพก่อนทำการโปรโมต
mkdir -p ./profiles
export LLVM_PROFILE_FILE="$PWD/profiles/webship-%p-%m.profraw"
./webship-pgo-training-1.5.0-<target> --config ./webship.tomlNew-Item -ItemType Directory -Force ./profiles
$env:LLVM_PROFILE_FILE = "$PWD/profiles/webship-%p-%m.profraw"
.\webship-pgo-training-1.5.0-<target>.exe --config .\webship.tomlllvm-profdata merge -sparse ./profiles/*.profraw -o ./webship.profdataเอกสารอ้างอิงของคำสั่ง
พื้นผิวเล็ก เริ่มต้นแบบชัดเจน
webship [OPTIONS] | webship update [OPTIONS]
-c, --config PATH- เลือกไฟล์ TOML ถ้าไฟล์ไม่มีอยู่ Webship จะสร้างไฟล์นั้นพร้อมตัวตน TLS แบบส่วนตัวบน localhost
--check-config- ตรวจสอบการกำหนดค่าทั้งหมดและออกโดยไม่เริ่มผู้ฟัง
--print-effective-config- พิมพ์การตั้งค่าที่รวมเข้าด้วยกันโดยเอาข้อมูลลับออก
update- ตรวจสอบ manifest ของชุมชนที่ลงนามแล้ว เลือกเป้าหมายแพลตฟอร์มนี้โดยตรง และติดตั้งเวอร์ชันใหม่กว่าเมื่อมี
--help / --version- พิมพ์ความช่วยเหลือของคำสั่งหรือเวอร์ชัน Webship ที่ติดตั้งอยู่
รูปแบบความล้มเหลวทั่วไป
เริ่มจากการกำหนดค่าแล้วค่อยเคลื่อนออกไป
- เรียกใช้ --check-config และแก้ไขข้อผิดพลาดแรกที่รายงาน; ฟิลด์ TOML ที่ไม่รู้จักจะถูกปฏิเสธ
- ยืนยันว่าพอร์ต TCP และ UDP ที่กำหนดสามารถใช้งานได้และได้รับอนุญาตโดยไฟร์วอลล์
- ยืนยันว่าใบรับรองและกุญแจมีอยู่ สามารถอ่านได้โดยบัญชีบริการ และเป็นคู่ที่ตรงกัน
- สำหรับ TLS อัตโนมัติ ยืนยันว่าทุกโดเมนที่ตั้งค่าชี้ไปยังโฮสต์ Webship
- เรียก /health บนตัวฟังแอปพลิเคชันภายในก่อนทดสอบผ่าน DNS หรือเส้นทางโหลดภายนอก
- เปิดใช้งานการสังเกตด้วยการตรวจสอบสิทธิ์ชั่วคราวเมื่อจำเป็นต้องมีหลักฐานในเวลารันไทม์