You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Crystal生产模式启动:如何让Kemal WebApp监听80/443端口?

让Kemal(Crystal)Web应用监听80/443端口的方法

我来给你梳理几个可行的方案,帮你的Kemal应用顺利监听80(HTTP)和443(HTTPS)端口:

1. 在代码中直接配置端口与SSL

如果你想把端口配置写死在代码里,可以修改Crystal应用代码,同时指定HTTP和HTTPS端口:

require "kemal"

# 配置HTTP监听80端口
Kemal.config.port = 80

# 启用HTTPS并配置443端口(需要提前准备好SSL证书和密钥)
Kemal.config.ssl = true
Kemal.config.ssl_certificate = "/absolute/path/to/your/certificate.pem"
Kemal.config.ssl_private_key = "/absolute/path/to/your/private-key.pem"
Kemal.config.ssl_port = 443

# 示例路由
get "/" do
  "Hello from Kemal running on 80 & 443!"
end

Kemal.run

2. 通过环境变量动态配置(无需修改代码)

如果不想硬编码配置,Kemal支持通过环境变量指定端口和SSL参数,灵活性更高:

  • 编译命令用生产环境优化模式:
    crystal build --release src/your_app.cr
    
  • 运行时通过环境变量传入配置:
    KEMAL_PORT=80 \
    KEMAL_SSL=true \
    KEMAL_SSL_PORT=443 \
    KEMAL_SSL_CERTIFICATE="/path/to/cert.pem" \
    KEMAL_SSL_PRIVATE_KEY="/path/to/key.pem" \
    ./your_app
    

3. 解决低端口权限问题(关键!)

在Linux/Unix系统中,1024以下的端口(比如80、443)默认需要root权限才能绑定,直接用root运行应用有安全风险,推荐两种更安全的方式:

方法A:使用setcap给可执行文件授权

编译完成后,给生成的可执行文件添加绑定低端口的权限,这样普通用户也能运行:

sudo setcap 'cap_net_bind_service=+ep' ./your_app

之后直接用普通用户执行./your_app即可,无需sudo。

方法B:用反向代理(比如Nginx)转发请求

如果不想修改应用权限,可以让Kemal继续监听3000端口,然后用Nginx做反向代理,将80/443的请求转发到3000。示例Nginx配置片段:

server {
    listen 80;
    server_name your-domain.com;

    location / {
        proxy_pass http://localhost:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

server {
    listen 443 ssl;
    server_name your-domain.com;

    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/key.pem;

    location / {
        proxy_pass http://localhost:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

这种方式还能帮你处理SSL终止、负载均衡等额外功能,非常适合生产环境。

内容的提问来源于stack exchange,提问作者Tyler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:56:56