Skip to content

A toy webserver written in Rust / Hợp Phì công nghiệp đại học 2023 máy tính internet chương trình học thiết kế

License

Notifications You must be signed in to change notification settings

Eslzzyl/webserver

Repository files navigation

Căn cứ vào Rust Web server

Đây là Hợp Phì công nghiệp đại học tuyên thành giáo khu 2023 năm 《 máy tính internet chương trình học thiết kế 》 hạng mục. Đề mục như sau:

Thiết kế mục đích

  1. Quen thuộc khai phá công cụ (Visual Studio, C/C++, Java chờ ) cơ bản thao tác;
  2. Nắm giữ http hiệp nghị công tác nguyên lý;
  3. Nắm giữ nhiều tuyến trình biên trình;
  4. Đối với Socket biên trình thành lập bước đầu khái niệm.
  5. Nắm giữ đối văn kiện internet truyền thao tác;

Thiết kế yêu cầu

  1. Không hạn ngôi cao, quen thuộc Socket API chủ yếu hàm số sử dụng;
  2. Thực hiện một cái đơn giản căn cứ vào http hiệp nghị WEB server;
  3. Thực hiện đối server vận hành trạng thái theo dõi;

Thiết kế nội dung

Thỉnh chú ý:

  1. Nơi này Web server, chỉ là đối HTTP thỉnh cầu ban cho trả lời; IE trình duyệt phỏng vấn server này, thỉnh cầu trước mặt server trung mỗ trạng thái tĩnh trang web văn kiện (html hoặc htm văn kiện chờ ), server đoan tuần tra server ngắm nghía ứng đường nhỏ hạ nên trang web hay không tồn tại, như tồn tại, tắc lợi dụng trước mặt TCP liên tiếp truyền lại nên trang web văn kiện, nếu không tồn tại, tắc phản hồi 404 sai lầm nhắc nhở.
  2. Không đề cập động thái trang web phân tích, nhưasp,aspx,php,jspChờ;
  3. Dự thi lự server nhiều bản cài đặt phỏng vấn vấn đề, tham kiến: Nhiều tuyến trình cơ chế, dị bước bộ tiếp tự I/O cơ chế hoặc bộ tiếp tự liên biểu từ từ;

Tự hỏi đề

  1. Nên server công tác hình thức là cái gì?
  2. Như thế nào đối này tiến hành thí nghiệm, còn có này đó có thể hoàn thiện công năng?
  3. Có biện pháp nào có thể đề cao nó tính năng?

Bổn thiết kế đã ở chương trình học thiết kế nghiệm thu trung hoạch bình “Ưu tú”.

Chương trình học thiết kế báo cáo có thể ởNơi nàyDownload. Có vấn đề có thể phát issue.

Công năng / Features

  • Căn cứ vàoTokioThực hiện TCP liên tiếp dị bước đồng phát xử lý
  • Tay động phân tích HTTP thỉnh cầu, tay động cấu tạo HTTP hưởng ứng
  • Duy trì HTTP GET, HEAD thỉnh cầu, bộ phận mà duy trì OPTIONS thỉnh cầu ( không duy trì CORS dự kiểm thỉnh cầu )
  • Duy trì HTTP 1.1
  • Duy trì HTTP áp súc, duy trì mã hóa có Brotli, Gzip, Deflate
  • Thông qua MIME biểu duy trì thường thấy Web cách thức
  • Duy trì đơn giản mệnh lệnh hành khống chế
  • Duy trì thông qua phối trí văn kiện sửa chữa server tham số
  • Thông qualog4rsDuy trì đơn giản nhật ký hệ thống, duy trì ký lục đến văn kiện hoặc tiêu chuẩn phát ra
  • Thông qua một cái FIFO văn kiện hoãn tồn giảm bớt ổ đĩa từ I/O số lần
  • Duy trì văn kiện danh sách hình thức ( chương trình học thiết kế thêm phân điểm )
    • Duy trì siêu liên tiếp nhảy chuyển
    • Văn kiện danh sách tự động bài tự
    • Bảng biểu sắp chữ, rõ ràng dễ đọc
  • Trạng thái mã giao diện động thái sinh thành
  • Đơn giản PHP giao diện duy trì ( chương trình học thiết kế chủ yếu thêm phân điểm )

Các loại thỉnh cầu phương pháp thí nghiệm:

  • GET: Sử dụng trình duyệt thí nghiệm có thể
  • HEAD
    eslzzyl:~$ curl --head 127.0.0.1:7878/ -i
    HTTP/1.1 200 OK
    Content-Length: 858
    Date: Mon, 19 Jun 2023 09:38:16 +0000
    Server: eslzzyl-webserver
  • OPTIONS
    eslzzyl:~$ curl -X OPTIONS 127.0.0.1:7878 -i
    HTTP/1.1 204 No Content
    Content-Length: 0
    Date: Mon, 19 Jun 2023 09:22:51 +0000
    Server: eslzzyl-webserver
    Allow: GET, HEAD, OPTIONS

Xây dựng / Build

Trang bị mới nhất Rust stable công cụ liên:Nơi này.Ta trong biên chế viết số hiệu khi sử dụng phiên bản là1.69.0.

Clone bổn kho hàng, sau đó chấp hành

cargo build --release

Ở xây dựng phía trước, nếu yêu cầu, có thể sửa chữa crates.io hướng dẫn tra cứu lấy nhanh hơn ỷ lại download. ThấyNơi này.

Vận hành / Run

  1. Trang bị PHP hoàn cảnh. Ở Ubuntu hạ, chấp hành

    sudo apt install php
    • Ở hệ thống khác ( như Windows ) trung, khả năng yêu cầu tay động phối trí hoàn cảnh lượng biến đổi.
    • PHP không phải tất yếu, nhưng là không có PHP hoàn cảnh tắc vô pháp sử dụng PHP mở rộng, server đem phản hồi 500 trạng thái mã.
  2. Khởi động server

    cargo run --release

Server cam chịu ở127.0.0.1Nghe lén, cam chịu cảng là7878,Nhưng có thể ở phối trí văn kiệnfiles/config.tomlTrung sửa đổi.

Nếu muốn ở vân server thượng vận hành:

  • Đemfiles/config.tomlTrunglocalHạng sửa vìfalse
  • Ở vân server tường phòng cháy hoặc an toàn tổ quản lý trung phóng thông chỉ địnhTCP nhập trạm cảng( cam chịu cảng vì 7878 )
  • Cái này món đồ chơi serverThực không an toàn,Đặc biệt là PHP duy trì bộ phận, không có bất luận cái gì an toàn phòng hộ thi thố.Nhất định không cầnLàm nó ở công võng hoàn cảnh trường kỳ vận hành, nếu không ngươi server khả năng sẽ bị xâm lấn!

Trình tự khởi động sau, mở ra trình duyệt, phỏng vấn127.0.0.1:7878.Nếu vận hành ở công võng, tắc đem IP thay đổi vì đối ứng công võng IP.

Cam chịu Web căn folder là./files/html/,Nhưng là có thể ở phối trí văn kiện trung sửa chữa.

  • Trình duyệt nếm thử thỉnh cầu/Khi, server đem phản hồi căn folder hạindex.html.
  • Trình duyệt nếm thử thỉnh cầu folder khi, server đem phản hồi văn kiện này kẹp hạ văn kiện danh sách.

Trình tự ở Ubuntu 22.04, Arch Linux, Windows 11 ngôi cao thí nghiệm quá, có thể bình thường vận hành.

Tính năng thí nghiệm / Benchmark

Trước mắt tính năng thí nghiệm kết quả đều là ở vô ưu hoá Debug hình thức hạ đến ra.

Khả năng ta số hiệu có chút vấn đề, ở cao đồng phát lúc ấy dùng một lần mở ra đại lượng socket liên tiếp, chiếm dụng rất nhiều socket file discriptor, một khi vượt qua thao tác hệ thống giả thiếtnlimitHạn chế ( cam chịu vì 1024 ), liền sẽ panic.

Tạm thời tăng lênnlimitHạn chế

cargo run --releaseKhởi động lúc sau, tra tìm tiến trình PID

ps -e|grep webserver

Sau đó tạm thời tăng lên hạn chế

sudo prlimit --pid [PID] --nofile=32768:32768

Lúc sau lại tiến hành thí nghiệm.

Thí nghiệm kết quả

  • Bổn cơ:

    eslzzyl:~/W/c/webbench-1.5 $./webbench -c 10000 -t 10 --get --http11 http://127.0.0.1:7878/
    Webbench - Simple Web Benchmark 1.5
    Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.
    
    Benchmarking: GET http://127.0.0.1:7878/ (using HTTP/1.1)
    10000 clients, running 10 sec.
    
    Speed=2991498 pages/min, 44423480 bytes/sec.
    Requests: 498583 susceed, 0 failed.

    Thí nghiệm 20000 đồng phát khi, cảng hào không đủ dùng. Khẳng định là ta số hiệu vấn đề, bình thường không nên là cái dạng này. Tóm lại 10000 đồng phát khẳng định là có.

    Thí nghiệm máy móc: AMD Ryzen 5 4600U, 16G DDR4, Ubuntu 22.04

  • Viễn trình server:

    eslzzyl:~/W/c/webbench-1.5 $./webbench -c 10000 -t 10 --get --http11 http://xx.xx.xx.xx:7878/
    Webbench - Simple Web Benchmark 1.5
    Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.
    
    Benchmarking: GET http://xx.xx.xx.xx:7878/ (using HTTP/1.1)
    10000 clients, running 10 sec.
    
    Speed=6864 pages/min, 101930 bytes/sec.
    Requests: 1144 susceed, 0 failed.
    eslzzyl:~/W/c/webbench-1.5 $./webbench -c 12000 -t 10 --get --http11 http://xx.xx.xx.xx:7878/
    Webbench - Simple Web Benchmark 1.5
    Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.
    
    Benchmarking: GET http://xx.xx.xx.xx:7878/ (using HTTP/1.1)
    12000 clients, running 10 sec.
    
    Speed=5430 pages/min, 81993 bytes/sec.
    Requests: 905 susceed, 0 failed.

    Thí nghiệm 20000 đồng phát khi đồng dạng xuất hiện vấn đề.

    Thí nghiệm máy móc: Đằng Tấn vân Thượng Hải 1 hạch 2G 1M, Ubuntu 22.04

Tham khảo văn hiến

Đặc biệt tỏ ý cảm ơn:ChatGPT,Ở bổn hạng mục biên soạn trong quá trình cung cấp cực đại trợ giúp.

Khai phá

Bởi vì chương trình học thiết kế đã kết thúc, bởi vậy nơi này ký lục một ít nội dung khả năng sẽ không thực mau thực hiện / chữa trị.

Công năng tăng thêm cùng điều chỉnh

  • Thực hiện LRU hoãn tồn: Đã từ bỏ. Bởi vì không thể không dùngunsafe,MàunsafeKết cấu tại tuyến trình chi gian truyền lại rất khó thực hiện.
  • Nhìn một cái PHP an toàn tính phương diện có hay không có thể khai quật địa phương

Tìm một cơ hội tinh giản một chút ỷ lại, trước mắt ỷ lại mau 100 cái, biên dịch quá chậm, rất nhiều ỷ lại chỉ là dùng đến một cái đơn giản công năng, không cần thiết dùng kho. Đặc biệt làConfigĐọc lấy kia bộ phận,serdeỶ lại có rất nhiều

Đãi chữa trị vấn đề

  • routeTìm không thấyindex.htmlKhi, hẳn là phản hồi căn đường nhỏ, đểResponseLiệt ra căn folder hạ văn kiện danh sách. Trước mắt là cam chịuindex.htmlNhất định tồn tại, sẽ panic.
  • Văn kiện hoãn tồn hẳn là đồng thời bảo tồn văn kiện sửa chữa thời gian, lại lần nữa thỉnh cầu cùng hoãn tồn khối khi so đối thời gian, nếu sửa chữa thời gian đã xảy ra biến hóa, lời thuyết minh kiện ở hoãn tồn trong lúc đã xảy ra biến hóa, lúc này không nên phản hồi hoãn tồn trung kết quả, mà là hẳn là một lần nữa đọc lấy văn kiện. Văn kiện danh sách hình thức có thể tồn trữ folder sửa chữa thời gian.
  • 【 nghiêm trọng vấn đề 】【 còn nghi vấn 】Ở tốc độ thấp trên mạng truyền tống hơi đại cơ số hai văn kiện sẽ bị dị thường gián đoạn

Những việc cần chú ý

Không thể làm URI thối lui đến wwwroot ở ngoài, nhưexample /../.Đối với loại này thỉnh cầu, hẳn là cấp một cái cự tuyệt phỏng vấn Response.

HTTP áp súc

Áp súc đã thực hiện, nhưng brotli phi thường chậm, bởi vậy cam chịu bắt đầu dùng gzip, vô luận trình duyệt hay không duy trì brotli. Nên logic có thể ởresponse.rsVăn kiệndecide_encodingHàm số trung sửa đổi.

About

A toy webserver written in Rust / Hợp Phì công nghiệp đại học 2023 máy tính internet chương trình học thiết kế

Topics

Resources

License

Stars

Watchers

Forks