Hello World

Authentik与Nginx配置进行“融合”

好的,绝对可以!你的 Typecho Nginx 配置非常规范,包含了 SSL、安全头、性能优化和正确的 PHP-FPM 设置,这是一个绝佳的基础。我们来把它与 Authentik 的配置完美地融合在一起。

这个过程的核心思想是:保留你所有优秀的现有配置,然后将 Authentik 的“认证检查点”精确地插入到处理动态请求的 location 块中。

下面是为你量身定制的、融合后的最终 Nginx 配置文件。你基本上可以直接复制粘贴,只需要修改我用 【请修改】 标记的 3个地方


融合后的最终 nginx.conf

# 这个 map 指令是 Authentik 模板自带的,用于 WebSocket,直接保留即可
# 将它放在所有 server 块之外的最顶层
map $http_upgrade $connection_upgrade_keepalive {
    default upgrade;
    ''      '';
}

# 你的 HTTPS 服务配置块
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    # --- 1. 你的服务器基础配置 (无需修改) ---
    server_name blog.ccbz.com;
    ssl_certificate /opt/ssl/blog.ccbz.com.cer;
    ssl_certificate_key /opt/ssl/blog.ccbz.com.key;
    # (保留你所有的 ssl_*, gzip_*, add_header 配置)
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1d;
    ssl_session_tickets off;
    ssl_stapling on;
    ssl_stapling_verify on;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    gzip on;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

    # 【请确认】Typecho 网站根目录,你的配置是正确的,保留即可
    root /usr/local/nginx/html/typecho;
    index index.php;

    # --- 2. Authentik 基础设施配置 (从模板中添加) ---
    # 增加的性能优化
    proxy_buffers 8 16k;
    proxy_buffer_size 32k;
    
    # 认证失败时,执行 @goauthentik_proxy_signin 内部跳转
    error_page 401 = @goauthentik_proxy_signin;

    # 认证失败后的跳转逻辑
    location @goauthentik_proxy_signin {
        internal;
        # 【请修改】这里必须是你 Authentik 的外部访问地址
        # 例如 https://auth.your-domain.com
        return 302 https://auth.ccbz.com/outpost.goauthentik.io/start?rd=$scheme://$http_host$request_uri;
    }

    # 与 Authentik Outpost 通信的内部接口,所有请求都无需认证
    location /outpost.goauthentik.io {
        # 【请修改】这里必须指向你的 Authentik Outpost 服务的真实地址和端口
        # 如果是 Docker 服务,就是服务名;如果是 IP,就是 IP 地址
        proxy_pass http://authentik-outpost-service:9000;
        
        # 保留 Authentik 模板中的其他设置
        proxy_set_header Host $host;
        proxy_set_header X-Original-URL $scheme://$http_host$request_uri;
        proxy_pass_request_body off;
        proxy_set_header Content-Length "";
    }

    # --- 3. 融合后的应用 Location 配置 ---
    
    # Typecho 的主 location,现在加入了 Authentik 认证
    location / {
        # --- Authentik 认证指令 ---
        auth_request /outpost.goauthentik.io/auth/nginx;

        # 从 Authentik 获取用户信息并存为 Nginx 变量
        auth_request_set $authentik_username $upstream_http_x_authentik_username;
        auth_request_set $authentik_groups $upstream_http_x_authentik_groups;
        auth_request_set $authentik_email $upstream_http_x_authentik_email;
        auth_request_set $authentik_name $upstream_http_x_authentik_name;
        auth_request_set $authentik_uid $upstream_http_x_authentik_uid;
        # --- Authentik 认证指令结束 ---

        # 保留你原有的 Typecho URL 重写规则
        try_files $uri $uri/ /index.php?$args;
    }

    # Typecho 的 PHP 处理器,也必须加入认证和信息传递
    location ~ \.php$ {
        # --- Authentik 认证指令 (必须重复) ---
        auth_request /outpost.goauthentik.io/auth/nginx;

        # 再次获取用户信息 (因 Nginx location 作用域原因)
        auth_request_set $authentik_username $upstream_http_x_authentik_username;
        auth_request_set $authentik_groups $upstream_http_x_authentik_groups;
        auth_request_set $authentik_email $upstream_http_x_authentik_email;
        auth_request_set $authentik_name $upstream_http_x_authentik_name;
        auth_request_set $authentik_uid $upstream_http_x_authentik_uid;
        # --- Authentik 认证指令结束 ---

        # --- 关键:将用户信息传递给 PHP-FPM ---
        fastcgi_param AUTH_USER $authentik_username;
        fastcgi_param AUTH_GROUPS $authentik_groups;
        fastcgi_param AUTH_EMAIL $authentik_email;
        fastcgi_param AUTH_NAME $authentik_name;
        fastcgi_param AUTH_UID $authentik_uid;
        # --- 信息传递结束 ---

        # 保留你原有的 PHP-FPM 配置
        try_files $uri =404;
        # 【请确认】你的 PHP-FPM 路径,你的配置是正确的,保留即可
        fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    # --- 4. 你的安全配置 (无需修改) ---
    location ~ \.(htaccess|htpasswd|svn|git) {
        deny all;
    }

    location ~* /(config|install|upgrade)\.php$ {
        deny all;
    }
}

# 你的 HTTP 重定向到 HTTPS 配置 (无需修改)
server {
    listen 80;
    listen [::]:80;
    server_name blog.ccbz.com;
    return 301 https://$host$request_uri;
}

详解和需要你修改的地方

你只需要关注并修改 3个 地方:

  1. location @goauthentik_proxy_signin 内部的 return 302

    • 你需要修改https://auth.ccbz.com
    • 为什么:这里必须是你的 Authentik 对外服务的完整域名。当用户未登录时,Nginx 会把他们重定向到这个地址去进行登录。
  2. location /outpost.goauthentik.io 内部的 proxy_pass

    • 你需要修改http://authentik-outpost-service:9000
    • 为什么:这里是 Nginx 和 Authentik Outpost 之间的内部通信地址。

      • 如果你是使用 docker-compose 部署的,这里应该是 Outpost 服务的服务名(例如 authentik_outpost 或你自己定义的名字),端口通常是 9000
      • 如果 Outpost 运行在另一台服务器上,这里就是 http://<outpost服务器的IP地址>:9000
    • 这是最容易出错的地方,请务必确保 Nginx 服务器可以访问到这个地址。
  3. 确认根目录和 PHP-FPM 路径 (检查即可)

    • root /usr/local/nginx/html/typecho;
    • fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
    • 你的原始配置中这两个路径是确定的,我已经在融合版中保留了它们。你只需要最后确认一下它们是否正确即可。

为什么这样融合?

最后步骤

  1. 备份你现在的 Nginx 配置文件。
  2. 用上面的融合版配置替换它。
  3. 修改那 3 个标记为 【请修改】 的地方。
  4. 测试配置语法:sudo nginx -t
  5. 如果成功,重新加载 Nginx:sudo systemctl reload nginx

现在,访问 https://blog.ccbz.com,享受你的单点登录吧!