Nginx 1.24.x 及更早版本可源码编译启用 ngx_http_perl_module,需安装 perl-devel/libperl-dev、ExtUtils::Embed,并配置 --with-http_perl_module 和 --with-perl;该模块自1.25.0起被移除,仅适用于遗留系统。

在 Linux 下通过源码编译安装 Nginx 并嵌入 Perl 模块(即启用 ngx_http_perl_module),需要特别注意依赖、配置选项和运行时环境。该模块允许你在 Nginx 配置中直接写 Perl 代码处理请求,但自 Nginx 1.17.5 起已标记为“deprecated”,1.25.0 后完全移除,因此仅建议用于遗留系统或特定测试场景。
确认 Perl 开发环境已就绪
模块依赖系统级 Perl 及其开发头文件(perl-devel 或 libperl-dev),否则 configure 会报错 no perl found 或 cannot find -lperl。
- RHEL/CentOS/Fedora:
yum install perl-devel perl-ExtUtils-Embed - Debian/Ubuntu:
apt install perl-base libperl-dev - 验证:
perl -V:archname和perl -MConfig -e 'print $Config{archlib}',确保路径可被 Nginx 构建识别
下载并配置含 Perl 支持的 Nginx 源码
必须使用 1.24.x 或更早版本(如 1.22.1),且 configure 时显式启用 --with-http_perl_module,同时推荐加上 --with-perl 指向 perl 解释器路径(避免自动探测失败):
./configure \ --prefix=/usr/local/nginx \ --with-http_perl_module \ --with-perl=/usr/bin/perl \ --with-http_ssl_module \ --with-http_v2_module
若提示 Perl not found,检查 perl -MExtUtils::Embed -e 'ccflags; ldflags; ccopts; lddlflags' 是否能正常输出;不能则需重装 perl-ExtUtils-Embed 包。
编译安装后配置 Perl 块示例
安装完成后,在 nginx.conf 的 http 或 server 块中声明 perl_set 或 location 内嵌 Perl:
perl_set $greet 'sub { return "Hello from Perl at " . localtime(); }';
server {
listen 80;
location /perl-test {
perl 'sub {
my $r = shift;
$r->send_http_header("text/plain");
$r->print("Perl is alive!\n");
$r->rflush();
}';
}
}
注意:perl 指令只能用于 location,且需确保 Nginx 主进程以足够权限运行(因加载动态 Perl 库);调试时加 error_log /path/to/error.log debug; 查看 perl 相关日志。
常见问题与规避要点
该模块对稳定性要求高,实际部署中易出问题:
- 不支持线程安全的 Perl(默认非线程版即可,避免用
perl -Duseithreads编译的版本) - Nginx worker 进程重启时,已加载的 Perl 模块不会自动 reload,修改脚本需 reload 全局配置
- 禁止在 Perl 代码中调用阻塞 I/O(如
system()、sleep),否则阻塞整个 worker - 生产环境强烈建议改用 OpenResty(基于 Lua)或反向代理到独立 Perl-FastCGI 服务(如 Starman + nginx fastcgi_pass)

















