2015-10-24 35 views
0

我試圖加快我的Perl腳本在nginx服務器上。在測試腳本中,如果我註釋掉3 .pm文件(所有這些都是自己的東西)的「使用」請求......腳本會丟失大約600毫秒的加載時間!現在我的猜測是,它是因爲它不得不從請求的子模塊中加載子模塊。例如:將Perl模塊加載到Nginx的內存中,使速度更快?

use WebService::Solr; 
use WebService::Solr::Query; 
use Want::View; 
use JSON; 
use POSIX; 

阿帕奇的mod_perl,您可以設置啓動腳本,因此「進口」的模塊到內存(使其更快)。與nginx和Perl類似嗎?我現在的腳本需要1.1秒的時間來處理(其中800-900ms是「等待」響應!!!!),所以我真的需要看到關於加速它。

更新:我發現了這一點,但它似乎並沒有工作:

http://search.cpan.org/~zzz/Nginx-Perl-1.2.9.7/src/http/modules/perl/Nginx.pm#DESCRIPTION

location ~ \.cgi$ { 

    perl_inc  /usr/local/share/perl/5.20.2/; 
    # perl_require WebService/Solr; 

    ... rest 

} 

我得到一個錯誤:

nginx: [emerg] unknown directive "perl_inc" in /etc/nginx/sites-enabled/site.net:134

我想知道如果因爲我需要安裝「Nginx」Perl模塊。當我嘗試通過MCPAN安裝時,我得到一個模具:

-lpthread -lcrypt -lcrypto -lcrypto -lz \ -Wl,-E -fstack-protector -L/usr/local/lib -L/usr/lib/x86_64-linux-gnu/perl/5.20/CORE -lperl -ldl -lm -lpthread -lc -lcrypt /usr/bin/ld: cannot find -lperl collect2: error: ld returned 1 exit status objs/Makefile:213: recipe for target 'objs/nginx-perl' failed make[1]: * [objs/nginx-perl] Error 1 make[1]: Leaving directory '/root/.cpan/build/Nginx-Perl-1.2.9.7-dbUMQF' Makefile:9: recipe for target 'build' failed make: * [build] Error 2
ZZZ/Nginx-Perl-1.2.9.7.tar.gz /usr/bin/make -- NOT OK

謝謝!

+0

我不能幫助nginx的具體細節,但如果你沒有找到更好的東西,你仍然可以設置Apache和mod_perl,並有nginx路由Perl請求那裏。 –

+0

@NickP - 謝謝。我試圖避免Apache作爲代理服務器,因爲它在服務器上運行的還有一件事情:) –

+0

如果我告訴你任何你認爲明顯出血的東西,請原諒我,但是「ld:找不到-lperl」意味着你不願意沒有安裝libperl,那麼你可以安裝它嗎? – Michael

回答

0

我認爲你必須通過安裝perl-dev或一些類似的包含C級perl綁定的包來解決cpan問題。將會是nginx-extras,或者可能是,在啓用了perl支持的情況下從源代碼重建您的nginx。

1

好的,所以我們終於明白了。它的一部分,我發現在這裏:

https://serverfault.com/questions/247355/how-do-i-configure-nginxs-embedded-perl-to-use-perl-modules

我們不得不使用--with-http_perl_module--with-perl_modules_path配置時標誌nginx的重新編譯。然後,另一件讓你感到困惑的事情就是你如何稱呼它。地方談話,我發現作爲一個參考,:

perl_lib 
perl_require 

我認爲這是確定以放入站點配置文件的location { }部分 - 但事實證明,需要進入主nginx.conf文件,在覈心:

http { 
    perl_modules /usr/local/share/perl/5.20.2/; 

    perl_require JSON.pm; 
    perl_require POSIX.pm; 

} 

..block。

這樣做,實際上似乎工作(重新啓動nginx時沒有編譯錯誤)。我還有更多的測試要做,只是爲了確保它確實在做一些事情 - 但從我所看到的情況來看,這是一個可行的解決方案。希望這可以幫助未來的其他人!

更新:我真的沒有看到加載時間任何區別:(我的邏輯是,perl_require加載模塊到內存中,然後將此通過腳本訪問更快(經文被加載到腳本本身)。這種理解是否正確?