UNPKG

arch-wiki-md-repo

Version:

All arch-wiki articles in markdown format, updated every two days.

542 lines (370 loc) 15.4 kB
Lighttpd是 一个安全,快速,标准,且非常灵活的网页服务器,并对高性能环境做了最佳化。相较于其他网页服务器它占用的内存很少,且注重CPU负载量。它的进阶功能集 (FastCGI,CGI,验证,输出压缩,网址重写等等)让Lighttpd成为每个试图拜托负载瓶颈的服务器的完美网页服务器软件。 ## Contents * [1 安装](#.E5.AE.89.E8.A3.85) * [2 设置](#.E8.AE.BE.E7.BD.AE) * [2.1 基本设置](#.E5.9F.BA.E6.9C.AC.E8.AE.BE.E7.BD.AE) * [2.2 CGI](#CGI) * [2.3 FastCGI](#FastCGI) * [2.3.1 PHP](#PHP) * [2.3.1.1 Using php-fpm](#Using_php-fpm) * [2.3.1.2 eAccelerator](#eAccelerator) * [2.3.1.3 Try a php page](#Try_a_php_page) * [2.3.2 Ruby on Rails](#Ruby_on_Rails) * [2.3.3 Python FastCGI](#Python_FastCGI) * [2.4 SSL](#SSL) * [2.4.1 Server Name Indication](#Server_Name_Indication) * [2.4.2 Redirect HTTP requests to HTTPS](#Redirect_HTTP_requests_to_HTTPS) * [2.5 Output Compression](#Output_Compression) * [3 疑难解答](#.E7.96.91.E9.9A.BE.E8.A7.A3.E7.AD.94) * [3.1 关于Lighttpd下载.php文件的情况](#.E5.85.B3.E4.BA.8ELighttpd.E4.B8.8B.E8.BD.BD.php.E6.96.87.E4.BB.B6.E7.9A.84.E6.83.85.E5.86.B5) * [3.2 CCS样式列表无法正确显示](#CCS.E6.A0.B7.E5.BC.8F.E5.88.97.E8.A1.A8.E6.97.A0.E6.B3.95.E6.AD.A3.E7.A1.AE.E6.98.BE.E7.A4.BA) * [4 参见](#.E5.8F.82.E8.A7.81) ## 安装 Lighttpd可以从[extra]仓库获得: ``` # pacman -S lighttpd ``` ## 设置 ### 基本设置 lighttpd配置文件: `/etc/lighttpd/lighttpd.conf`。在安装完成后它会自动生成一个用于测试的测试页面。 想要检查 `lighttpd.conf` 中的语法错误,可以使用以下命令来快速查找错误: ``` $ lighttpd -t -f /etc/lighttpd/lighttpd.conf ``` 预设配置文件会把这里 `/srv/http/` 指定为提供HTTP服务的文件目录。 测试安装结果: ``` # chmod 755 /srv/http/index.html # echo 'TestMe!' >> /srv/http/index.html ``` 修改日志目录权限: ``` # chown -R http:http /var/log/lighttpd ``` 启动服务: ``` # systemctl start lighttpd ``` 然后就可以使用浏览器打开网址 `localhost` ,你应该能见到测试页面。 开机自动启动: ``` # systemctl enable lighttpd ``` 示例配置文件在 `/usr/share/doc/lighttpd/`。 ### CGI [Common Gateway Interface](https://en.wikipedia.org/wiki/Common_Gateway_Interface "wikipedia:Common Gateway Interface") (CGI) 脚本对于lighttpd可以开箱即用, 你只需要开启CGI模块, 指定配置文件,并确保指定语言的解释器已经安装。 (如:使用python需要安装 [python](https://www.archlinux.org/packages/?name=python)) 创建 `/etc/lighttpd/conf.d/cgi.conf` ,添加以下内容: ``` server.modules += ( "mod_cgi" ) cgi.assign = ( ".pl" => "/usr/bin/perl", ".cgi" => "/usr/bin/perl", ".rb" => "/usr/bin/ruby", ".erb" => "/usr/bin/eruby", ".py" => "/usr/bin/python", ".php" => "/usr/bin/php-cgi" ) index-file.names += ( "index.pl", "default.pl", "index.rb", "default.rb", "index.erb", "default.erb", "index.py", "default.py", "index.php", "default.php" ) ``` 对于PHP脚本,请确认在 `/etc/php/php.ini`添加了下列配置: ``` cgi.fix_pathinfo = 1 ``` 在你的lighttpd配置文件中`/etc/lighttpd/lighttpd.conf`添加: ``` include "conf.d/cgi.conf" ``` ### FastCGI 安装 [fcgi](https://www.archlinux.org/packages/?name=fcgi),之后你的lighttpd就有了fcgi支持, 以下内容是给需要使用Ruby,PHP或者Python的人的指导。 **注意:** lighttpd现在默认以用户 `http` 运行。 首先复制一份默认配置,从 `/usr/share/doc/lighttpd/config/conf.d/fastcgi.conf` 复制到 `/etc/lighttpd/conf.d` 将以下内容添加到 `/etc/lighttpd/conf.d/fastcgi.conf` ``` server.modules += ( "mod_fastcgi" ) #server.indexfiles += ( "dispatch.fcgi" ) #this is deprecated index-file.names += ( "dispatch.fcgi" ) #dispatch.fcgi if rails specified server.error-handler-404 = "/dispatch.fcgi" #too fastcgi.server = ( ".fcgi" => ( "localhost" => ( "socket" => "/run/lighttpd/rails-fastcgi.sock", "bin-path" => "/path/to/rails/application/public/dispatch.fcgi" ) ) ) ``` 然后在 `/etc/lighttpd/lighttpd.conf`中添加: ``` include "conf.d/fastcgi.conf" ``` 下面是关于PHP和Ruby on Rails的指导。 #### PHP 安装 [php](https://www.archlinux.org/packages/?name=php) 和 [php-cgi](https://www.archlinux.org/packages/?name=php-cgi) (可以参阅 [PHP](/index.php/PHP "PHP") 、 [LAMP](/index.php/LAMP "LAMP")). 确认php-cgi可以工作: `php-cgi --version` ``` PHP 5.4.3 (cgi-fcgi) (built: May 8 2012 17:10:17) Copyright (c) 1997-2012 The PHP Group Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies ``` 如果输出内容与上面相仿则php已经正确安装。 创建一份新的配置文件: `/etc/lighttpd/conf.d/fastcgi.conf` ``` # Make sure to install php and php-cgi. See: # https://wiki.archlinux.org/index.php/Fastcgi_and_lighttpd#PHP server.modules += ("mod_fastcgi") # FCGI server # =========== # # Configure a FastCGI server which handles PHP requests. # index-file.names += ("index.php") fastcgi.server = ( # Load-balance requests for this path... ".php" => ( # ... among the following FastCGI servers. The string naming each # server is just a label used in the logs to identify the server. "localhost" => ( "bin-path" => "/usr/bin/php-cgi", "socket" => "/tmp/php-fastcgi.sock", # breaks SCRIPT_FILENAME in a way that PHP can extract PATH_INFO # from it "broken-scriptfilename" => "enable", # Launch (max-procs + (max-procs * PHP_FCGI_CHILDREN)) procs, where # max-procs are "watchers" and the rest are "workers". See: # https://redmine.lighttpd.net/projects/1/wiki/frequentlyaskedquestions#How-many-php-CGI-processes-will-lighttpd-spawn "max-procs" => 4, # default value "bin-environment" => ( "PHP_FCGI_CHILDREN" => "1" # default value ) ) ) ) ``` 在/etc/lighttpd/lighttpd.conf中添加以下内容使新配置能够应用: `/etc/lighttpd/lighttpd.conf` ``` include "conf.d/fastcgi.conf" ``` **注意:** 模块顺序十分重要, 正确地模块加载顺序位于 `/usr/share/doc/lighttpd/config/modules.conf`. 任何错误配置都可能导致 *lighttpd* 崩溃。 重新加载 lighttpd: 1. systemctl restart lighttpd **注意:** * 如果你在访问php文件时遇到诸如 *No input file found* 的错误, 有很多原因可以导致这个错误,请参阅 [this FAQ](http://redmine.lighttpd.net/projects/1/wiki/frequentlyaskedquestions#I-get-the-error-No-input-file-specified-when-trying-to-use-PHP) 。 * 确认没有其他模块 (如 `mod_cgi`) 负责处理php文件。 ##### Using php-fpm There is no adaptive spawning anymore in recent lighttpd releases. For dynamic management of PHP processes, you can use [php-fpm](https://www.archlinux.org/packages/?name=php-fpm). ``` # pacman -S php-fpm # rc.d start php-fpm ``` **Note:** You can configure the number of servers in the pool and tweak other configuration options by editing the file `/etc/php/php-fpm.conf`. More details on *php-fpm* can be found on the [php-fpm website](http://php-fpm.anight.org/). You should also note that when you make changes to /etc/php/php.ini you will need to restart php-fpm In `/etc/lighttpd/conf.d/fastcgi.conf` add: ``` server.modules += ( "mod_fastcgi" ) index-file.names += ( "index.php" ) fastcgi.server = ( ".php" => ( "localhost" => ( "socket" => "/run/php-fpm/php-fpm.sock", "broken-scriptfilename" => "enable" )) ) ``` ##### eAccelerator Install [eaccelerator](https://aur.archlinux.org/packages/eaccelerator/) from the [AUR](/index.php/AUR "AUR"). Add own config file for eaccelerator: `/etc/php/conf.d/eaccelerator-own.ini` ``` zlib.output_compression = On cgi.fix_pathinfo=1 eaccelerator.cache_dir="/home/phpuser/eaccelerator/cache" ``` **Tip:** I additionally set `safe_mod` to `On` in my setup, but this is not required. ##### Try a php page Create the following php page, name it index.php, and place a copy in both /srv/http/ and /srv/http-ssl/html/ ``` <?php phpinfo(); ?> ``` Try navigating with a web browser to both the http and https address of your server. You should see the phpinfo page. Check eaccelerator caching: ``` # ls -l /home/phpuser/eaccelerator/cache ``` If the above command outputs the following: ``` -rw------- 1 phpuser phpuser 456 2005-05-05 14:53 eaccelerator-277.58081 -rw------- 1 phpuser phpuser 452 2005-05-05 14:53 eaccelerator-277.88081 ``` Then eaccelerator is happily caching your php scripts to help speed things up. #### Ruby on Rails Install and configure FastCGI. (See [#FastCGI](#FastCGI) above.) Install [ruby](/index.php/Ruby "Ruby") from [extra] and [ruby-fcgi](https://aur.archlinux.org/packages/ruby-fcgi/) from [AUR](/index.php/AUR "AUR"). Follow instructions on [RubyOnRails](/index.php/RubyOnRails "RubyOnRails"). #### Python FastCGI Install flup ``` # pacman -S python2-flup ``` Configure: ``` fastcgi.server = ( ".py" => ( "python-fcgi" => ( "socket" => "/run/lighttpd/fastcgi.python.socket", "bin-path" => "test.py", "check-local" => "disable", "max-procs" => 1, ) ) ) ``` ### SSL Generate an SSL Cert, e.g. like that: ``` # mkdir /etc/lighttpd/certs # openssl req -x509 -nodes -days 7300 -newkey rsa:2048 -keyout /etc/lighttpd/certs/www.example.com.pem -out /etc/lighttpd/certs/www.example.com.pem # chmod 600 /etc/lighttpd/certs/www.example.com.pem ``` Edit `/etc/lighttpd/lighttpd.conf`. To make lighttpd SSL-only (you probably need to set the server port to 443 as well) ``` ssl.engine = "enable" ssl.pemfile = "/etc/lighttpd/certs/www.example.com.pem" ``` To enable SSL in addition to normal HTTP ``` $SERVER["socket"] == ":443" { ssl.engine = "enable" ssl.pemfile = "/etc/lighttpd/certs/www.example.com.pem" } ``` If you want to serve different sites, you can change the document root inside the socket conditional: ``` $SERVER["socket"] == ":443" { server.document-root = "/srv/ssl" # use your ssl directory here ssl.engine = "enable" ssl.pemfile = "/etc/lighttpd/certs/www.example.com.pem" # use the path where you created your pem file } ``` or as alternative you can use the scheme conditional to distinguish between secure and normal requests. ``` $HTTP["scheme"] == "https" { server.document-root = "/srv/ssl" # use your ssl directory here ssl.engine = "enable" ssl.pemfile = "/etc/lighttpd/certs/www.example.com.pem" # use the path where you created your pem file } ``` Note that you cannot use the scheme conditional around ssl.engine above, since lighttpd needs to know on what port to enable SSL. ##### Server Name Indication To use [SNI](https://en.wikipedia.org/wiki/Server_Name_Indication "wikipedia:Server Name Indication") with lighttpd, simply put additional ssl.pemfile configuration directives inside host conditionals. It seems a default ssl.pemfile is still required, though. ``` $HTTP["host"] == "www.example.org" { ssl.pemfile = "/etc/lighttpd/certs/www.example.org.pem" } ``` ``` $HTTP["host"] == "mail.example.org" { ssl.pemfile = "/etc/lighttpd/certs/mail.example.org.pem" } ``` #### Redirect HTTP requests to HTTPS You should add "mod_redirect" in server.modules array in `/etc/lighttpd/lighttpd.conf`: ``` server.modules = ( ... "mod_redirect", ... ) ``` ``` $SERVER["socket"] == ":80" { $HTTP["host"] =~ "example.org" { url.redirect = ( "^/(.*)" => "[https://example.org/$1](https://example.org/$1)" ) server.name = "example.org" } } ``` ``` $SERVER["socket"] == ":443" { ssl.engine = "enable" ssl.pemfile = "/etc/lighttpd/ssl/server.pem" server.document-root = "..." } ``` To redirect all hosts to their secure equivalents use the following in place of the socket 80 configuration above: ``` $SERVER["socket"] == ":80" { $HTTP["host"] =~ "(.*)" { url.redirect = ( "^/(.*)" => "[https://%1/$1](https://%1/$1)" ) } } ``` To redirect all hosts for part of the site (e.g. secure or phpmyadmin): ``` $SERVER["socket"] == ":80" { $HTTP["url"] =~ "^/secure" { url.redirect = ( "^/(.*)" => "[https://example.com/$1](https://example.com/$1)" ) } } ``` ### Output Compression In `/etc/lighttpd/lighttpd.conf` add ``` var.cache_dir = "/var/cache/lighttpd" ``` Then create directory for a compressed files: ``` # mkdir /var/cache/lighttpd/compress # chown http:http /var/cache/lighttpd/compress ``` Copy example configuration file: ``` # mkdir /etc/lighttpd/conf.d # cp /usr/share/doc/lighttpd/config/conf.d/compress.conf /etc/lighttpd/conf.d/ ``` Add following in `/etc/lighttpd/lighttpd.conf`: ``` include "conf.d/compress.conf" ``` **Note:** You can not do this (copy compress.conf) and add a needed content in `/etc/lighttpd/lighttpd.conf` instead. ## 疑难解答 ### 关于Lighttpd下载.php文件的情况 若Lighttpd仅仅是下载`.php`文件而不是去“初始化”它们,那么你可能没把下面的一些设置写入你的配置文件里`/etc/lighttpd/lighttpd.conf`。 ``` server.modules = ( "mod_fastcgi", ) fastcgi.server = ( ".php" => (( "bin-path" => "/usr/bin/php-cgi", #depends where your php-cgi has been installed. Default here. "socket" => "/tmp/php.socket", "max-procs" => 2, "bin-environment" => ( "PHP_FCGI_CHILDREN" => "16", "PHP_FCGI_MAX_REQUESTS" => "10000" ), "bin-copy-environment" => ( "PATH", "SHELL", "USER" ), "broken-scriptfilename" => "enable" ))) ``` ### CCS样式列表无法正确显示 Lighttpd的默认设置是没有包括CSS的媒体类型的,所以标准的浏览器把text/CSS误以为text/html而混淆彼此,最终什么都没有正确的显示出来。要解决这个问题需要在CSS中增加一条说明。 ``` mimetype.assign = ( ".html" => "text/html", ".txt" => "text/plain", ".jpg" => "image/jpeg", ".png" => "image/png", ".css" => "text/css" ) ``` 换行不是必须的,仅仅为了可读性。 ## 参见 * [Lighttpd wiki](http://redmine.lighttpd.net/projects/lighttpd/wiki)