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个 地方:
location @goauthentik_proxy_signin内部的return 302:- 你需要修改:
https://auth.ccbz.com - 为什么:这里必须是你的 Authentik 对外服务的完整域名。当用户未登录时,Nginx 会把他们重定向到这个地址去进行登录。
- 你需要修改:
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 服务器可以访问到这个地址。
- 你需要修改:
确认根目录和 PHP-FPM 路径 (检查即可)
root /usr/local/nginx/html/typecho;fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;- 你的原始配置中这两个路径是确定的,我已经在融合版中保留了它们。你只需要最后确认一下它们是否正确即可。
为什么这样融合?
- 保留优点:我们完整保留了你精心配置的 SSL、HSTS、Gzip 等所有优化和安全项。
- 精确注入:我们将 Authentik 的
auth_request指令,像“安检门”一样,安装在了location /和location ~ \.php$两个入口。之所以\.php$也要加,是为了防止用户直接访问 PHP 文件而绕过检查。 - 适配 PHP-FPM:最关键的一步是,我们没有用
proxy_set_header,而是用了fastcgi_param。这是将 Authentik 传来的用户信息(如用户名、邮箱)正确传递给 PHP 的标准方式。你的 Typecho 代码现在可以通过$_SERVER['AUTH_USER']、$_SERVER['AUTH_EMAIL']等方式获取到登录用户的信息了。
最后步骤
- 备份你现在的 Nginx 配置文件。
- 用上面的融合版配置替换它。
- 修改那 3 个标记为
【请修改】的地方。 - 测试配置语法:
sudo nginx -t - 如果成功,重新加载 Nginx:
sudo systemctl reload nginx
现在,访问 https://blog.ccbz.com,享受你的单点登录吧!
- 上一篇: Alpine安装 WireGuard 作为客户端
- 下一篇: 如何在树莓派3B和4B上禁用LED