κ²°λ‘ λΆν°: μ΄μ μ±ν
μ μ€μκ° λ°±μλκ° Rustλ‘ κ΅¬νλμ΄ μμ΅λλ€.
μ μΒ·λνΒ·κΈ°λ‘Β·λ³΄κ΄ μ²λ¦¬λ Rust(Axum) WebSocket μλ²κ° λ΄λΉνκ³ ,
Apacheλ HTTPS μ’
λ¨κ³Ό mod_proxy_wstunnel 리λ²μ€νλ‘μ μν λ§ ν©λλ€.
PHPλ λ μ΄μ μ¬μ©νμ§ μμ΅λλ€(μ΄μ api.phpλ ν΄λ°±μΌλ‘λ§ λ³΄κ΄).
νμ¬ κ΅¬μ± (μ€μ λμ μ€ν)
| κ³μΈ΅ | κΈ°μ | μν |
| νλ°νΈμλ | HTML Β· CSS Β· Vanilla JS | UI, WebSocket μ‘μμ (ν΄λ§ μμ) |
| μ£μ§ | Apache 2.4 + mod_proxy_wstunnel | HTTPS μ’
λ¨, /rust/chat/ws β λ°±μλ WS νλ‘μ |
| λ°±μλ | Rust Β· Axum + Tokio (127.0.0.1:8787) | WebSocket νλΈ, λΈλ‘λμΊμ€νΈ, κΈ°λ‘/μ 리 |
| μ μ₯μ | νμΌ data/chat.jsonl (JSON Lines) | Tokio Mutex 보νΈ, μ΅κ·Ό 1μκ°λ§ λ³΄κ΄ |
| μλ³ | μ μ IP(X-Forwarded-For) | λλ€μμΌλ‘ μ¬μ© |
| λ³΄κ΄ μ 리 | Tokio interval νμ€ν¬(60μ΄) | 1μκ° μ§λ κΈ°λ‘ μμ (νμΌ μ¬μμ±) |
μ€μκ° νλ¦ (WebSocket)
λΈλΌμ°μ (JS WebSocket)
β μ°κ²° β Apache :443 /rust/chat/ws (wss)
β ββ mod_proxy_wstunnel ββ ws://127.0.0.1:8787/ws
βΌ
Rust Axum μλ²
ββ μ μ μ¦μ: μ΅κ·Ό 1μκ° history μ μ‘ + join λΈλ‘λμΊμ€νΈ
ββ λ©μμ§ μμ : μ 체 μ μμμκ² broadcast + νμΌ append
ββ presence: μ μ/ν΄μ μ νμ± IP λͺ©λ‘ push
ββ 60μ΄λ§λ€ 1μκ° μ§λ κΈ°λ‘ μ 리(νμΌ μ¬μμ±)
Rust ν΅μ¬ μμ
| μμ | Rust ꡬν |
| HTTP/WS λΌμ°ν
| axum::Router + WebSocketUpgrade |
| λμμ±/λ°νμ | tokio (async), broadcast::channel ν¬μμ |
| 곡μ μν | Arc<App> + tokio::sync::Mutex |
| μ§λ ¬ν | serde / serde_json |
| λ³΄κ΄ μ 리 | tokio::time::interval μ£ΌκΈ° νμ€ν¬ |