You are browsing a read-only backup copy of Wikitech. The live site can be found at wikitech.wikimedia.org
Help:Toolforge/Web/Lighttpd: Difference between revisions
imported>BryanDavis (tool-labs -> toolforge) |
imported>Chico Venancio (→With aliases: toolname is already defined) |
||
Line 247: | Line 247: | ||
Note that you cannot add an [https://redmine.lighttpd.net/projects/lighttpd/wiki/Docs_ModAlias alias] URL for <code>/toolname</code> because this has already been defined and can't be overridden in the local conf file. You can add an alias for subdirectories with: | Note that you cannot add an [https://redmine.lighttpd.net/projects/lighttpd/wiki/Docs_ModAlias alias] URL for <code>/toolname</code> because this has already been defined and can't be overridden in the local conf file. You can add an alias for subdirectories with: | ||
alias.url += (" | alias.url += ("/subdir" => "/data/project/toolname/physical/path/of/subdir/") | ||
== PHP == | == PHP == |
Revision as of 16:16, 30 January 2018
Lighttpd is the HTTP server used by both the lighttpd
and lighttpd-plain
types supported by webservice
. These types are supported by both the Grid Engine and Kubernetes backends.
- Error logs from the lighttpd process are stored in
$HOME/error.log
- PHP scripts are automatically run using a FastCGI helper process.
- The lighttpd web server is configurable (including adding other FastCGI handlers). A
$HOME/.lighttpd.conf
file can be used to change the default configuration. - Everything runs as the tool user, regardless of file ownership.
The web server reads any configuration in $HOME/.lighttpd.conf
, and merges it with the default configuration. Most tools will not need custom configuration.
Sometimes merge fails if an option is already set in the default configuration. When this happens, try using
option += value
instead of option = value
.
Default configuration
This is the default (if you don't specify any other/additional settings in your tool's .lighttpd.conf)
Default lighttpd configuration |
---|
The following content has been placed in a collapsed box for improved usability. |
server.modules = ( "mod_setenv", "mod_access", "mod_accesslog", "mod_alias", "mod_compress", "mod_redirect", "mod_rewrite", "mod_fastcgi", "mod_cgi", ) server.port = {port} server.use-ipv6 = "disable" server.username = "{username}" server.groupname = "{groupname}" server.core-files = "disable" server.document-root = "{home}/public_html" server.pid-file = "/var/run/lighttpd/{toolname}.pid" server.errorlog = "{home}/error.log" server.breakagelog = "{home}/error.log" server.follow-symlink = "enable" server.max-connections = 300 server.stat-cache-engine = "simple" server.event-handler = "linux-sysepoll" ssl.engine = "disable" alias.url = ( "/{toolname}" => "{home}/public_html/" ) index-file.names = ( "index.php", "index.html", "index.htm" ) dir-listing.encoding = "utf-8" server.dir-listing = "disable" url.access-deny = ( "~", ".inc" ) static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" ) accesslog.use-syslog = "disable" accesslog.filename = "{home}/access.log" include_shell "/usr/share/lighttpd/create-mime.assign.pl" cgi.assign = ( ".pl" => "/usr/bin/perl", ".py" => "/usr/bin/python", ".pyc" => "/usr/bin/python", ) fastcgi.server += ( ".php" => (( "bin-path" => "/usr/bin/php-cgi", "socket" => "/var/run/lighttpd/php.socket.{toolname}", "max-procs" => 2, "bin-environment" => ( "PHP_FCGI_CHILDREN" => "2", "PHP_FCGI_MAX_REQUESTS" => "500" ), "bin-copy-environment" => ( "PATH", "SHELL", "USER" ), "broken-scriptfilename" => "enable", "allow-x-send-file" => "enable" )) ) (config as of 2017-01-23) |
The above content has been placed in a collapsed box for improved usability. |
See lighttpdwebservice.py in operations/software/tools/webservice for the canonical configuration.
Example configurations
FCGI Flask config
fastcgi.server += ( "/gerrit-patch-uploader" => (( "socket" => "/tmp/patchuploader-fcgi.sock", "bin-path" => "/data/project/gerrit-patch-uploader/src/gerrit-patch-uploader/app.fcgi", "check-local" => "disable", "max-procs" => 1, )) )
For Flask, the fcgi handler looks like this: https://github.com/valhallasw/gerrit-patch-uploader/blob/master/app.fcgi
URL rewrite
- Documentation: ModRewrite
Note that rewrite rules always execute before redirect rules (regardless of their order in the config file).
url.rewrite-once += ( "/toolname/id/([0-9]+)" => "/toolname/index.php?id=$1", "/toolname/link/([a-zA-Z]+)" => "/toolname/index.php?link=$1" )
If you are rewriting the tool's entire path (as is common where an application will handle URL routing), don't forget that you may also need to rewrite files such as stylesheets to ensure they can still be accessed.
url.rewrite-once = ( ".*\.(js|css)" => "$0", "^/toolname(/.*)" => "/toolname/index.php$1" )
The "$0" matches the entire match from the left-hand side.
Header, mimetype, character encoding, error handler
# Allow Cross-Origin Resource Sharing (CORS) setenv.add-response-header += ( "Access-Control-Allow-Origin" => "en.wikipedia.org", "Access-Control-Allow-Methods" => "POST, GET, OPTIONS" ) # Set cache-control directive for static files and resources $HTTP["url"] =~ "\.(jpg|gif|png|css|js|txt|ico)$" { setenv.add-response-header += ( "Cache-Control" => "max-age=86400, public" ) } mimetype.assign += ( # Add custom mimetype ".bulk" => "text/plain", # Avoid [[Mojibake]] in JavaScript files ".js" => "application/javascript; charset=utf-8", # Default MIME type with UTF-8 character encoding "" => "text/plain; charset=utf-8" ) # Add custom error-404 handler server.error-handler-404 += "/error-404.php"
Details: ModSetEnv Mimetype-Assign Error-Handler-404 HTTP access control (CORS)
Directory or file index
# Enable basic directory index $HTTP["url"] =~ "^/?" { dir-listing.activate = "enable" }
# Deny access to hidden files $HTTP["url"] =~ "/\." { url.access-deny = ("") }
Details: ModAccess
Custom index
# Enable index for specific directory $HTTP["url"] =~ "^/download($|/)" { dir-listing.activate = "enable" } # Custom index file or custom directory generator index-file.names += ("index.py")
Details: ModDirlisting
Request logging
- Documentation: DebugVariables
Add the line:
# Enable request logging debug.log-request-handling = "enable"
The debug output will be written to the error.log
file.
Apache-like cgi-bin directory
Add the following stanza:
$HTTP["url"] =~ "^/your_tool/cgi-bin" { cgi.assign = ( "" => "" ) }
This does require that cgi-bin be under your public_html rather than alongside it.
To run CGI from any directory under your public_html only need this one line (w/out the $HTTP["url"] .. block)
cgi.assign += ( ".cgi" => "" )
The part to the left is the file name or extension ("" = any). The part to the right is the program which will run it ("" = any). Another example
cgi.assign += ( "script.sh" => "/bin/bash" )
Enable status and statistics
# modify <toolname> for your tool # this will enable counters http://tools.wmflabs.org/<toolname>/server-status (resp: .../server-statistics) server.modules += ("mod_status") status.status-url = "/<toolname>/server-status" status.statistics-url = "/<toolname>/server-statistics"
Details: ModStatus
Web logs
Your tool's web logs are placed in the tool account's $HOME/access.log
in common format. Please note that the web logs are anonymized in accordance with the Foundation’s privacy policy. Each user IP address will appear to be that of the local host, for example. In general, the privacy policy precludes the logging of personally identifiable information; special permission from Foundation legal counsel is required if such information is required.
Error logs can be found in the tool account's $HOME/error.log
; this includes the standard error of invoked scripts.
Error pages
The proxy provides its own error pages when your application returns HTTP/500, HTTP/502 or HTTP/503. This behavior is currently under review, and might change in the near future.
You can bypass the proxy error pages by passing an X-Wikimedia-Debug header.
Changing the document root
With symlinks
The easiest way to change the document root is with a symlink to $HOME/public_html
. However, before this is done, the existing public_html directory needs to be deleted or moved. This is because ln -s $HOME/foo $HOME/public_html
would make $HOME/public_html/foo
if the $HOME/public_html
directory exists. Deleting the directory is done with rm -rf $HOME/public_html
to delete the directory and all of it's contents, if you do not need anything in there, or with mv $HOME/public_html $HOME/oldpublic_html
to move the directory to $HOME/oldpublic_html
.
To make the symlink, ln -s $HOME/foo $HOME/public_html/
would make the contents of $HOME/foo
available in $HOME/public_html
. Replace $HOME/foo
in the example with the directory you want lighttpd to serve.
With aliases
Note that you cannot add an alias URL for /toolname
because this has already been defined and can't be overridden in the local conf file. You can add an alias for subdirectories with:
alias.url += ("/subdir" => "/data/project/toolname/physical/path/of/subdir/")
PHP
The lighttpd
webservice type includes support for running PHP scripts from files with a .php
in $HOME/public_html
using a FastCGI helper process.
PHP ini settings can be changed for your tool by creating a $HOME/public_html/.user.ini
configuration file. This can be useful for setting the default timezone with date.timezone
. See the documentation at php.net for more details.