MythWeb on Nginx

From MythTV Official Wiki
Revision as of 00:55, 8 November 2011 by Stuarta (talk | contribs)

Jump to: navigation, search

Incomplete.png Incomplete, needs to be expanded. Please help to fill the gaps or discuss the issue on the talk page

TODO

  • work in progress - stuarta
  • Perl Backend

Intro

MythWeb provides a web interface for scheduling and managing recordings from a web browser located on any machine, with new features being added such as remote control.

An Apache server can use a lot of memory, especially for a system where the number of users of the server can be measured on one hand...essentially private. Nginx(pronounced N-Gen-X), is a lightweight, high-performance Web server/reverse proxy.

Installation

Your distribution should have a package for nginx. It is probably woefully out of date. Do yourself a favour and go and get the packages provided at nginx.org [[1]]

The default HTML directory for the nginx packages is /usr/share/nginx/html, whereas a package of MythWeb goes to the Apache directory.../var/www/html/. You can create a symbolic link, or just have nginx root to the same directory as Apache...a good move if you aren't sure you are going to commit to an alternate web server.

So, we'll assume the root is /var/www/html and that the mythweb directory is right off the root.


When trying to understand how nginx does things, it's important to remember that it is a proxy first and a web server second. It just happens to be a blindingly fast web server :)

It is for this reason that you have to install a php backend server as well as a perl backend server.

PHP Backend

Fast-CGI for PHP

Unlike Apache, Nginx doesn't have PHP support built in, and it must be configured for it. The old way was to use fast-cgi. If you are using nginx, you are trying to get performance and scalability. Forget FastCGI and install php-fpm. If you really have trouble finding php fpm then these instructions should also work for fastcgi.

PHP FPM

Ubuntu/Debian have php fpm packages available by default.

apt-get install php5-fpm

This installs a php fpm instance and the default configuration out of the box has it listening on 127.0.0.1:9000

Perl Backend

Incomplete.png Incomplete, needs to be expanded. Please help to fill the gaps or discuss the issue on the talk page

Configuration

Unlike Apache, Nginx does not support .htaccess files, so all configuration must go in the nginx configuration. Of course, for convenience, nginx is defaultly set up to include all files on a conf.d directory, so you can separate out pieces for portability.

/etc/nginx/conf.d/mythweb.include

I'd recommend creating a file /etc/nginx/conf.d/mythweb.include with the following contents

   location /mythweb/ {
       auth_basic		"MythWeb";
       auth_basic_user_file	mythweb.passwd;
       index /mythweb/mythweb.php;
       try_files $uri @handler;
   }

   location ~ /mythweb/.+\.php {
       include         fastcgi_params;
       fastcgi_index   mythweb.php;
       fastcgi_split_path_info ^(.+\.php)(/?.+)$;
       fastcgi_param   SCRIPT_FILENAME	$document_root$fastcgi_script_name;
       fastcgi_param   PATH_INFO $fastcgi_path_info;
       fastcgi_param   db_server localhost;
       fastcgi_param   db_name  mythconverg;
       fastcgi_param   db_login mythtv;
       fastcgi_param   db_password mythtv;
       fastcgi_param   hostname mymythbox;
       fastcgi_pass    127.0.0.1:9000;
   }

   location @handler {
       rewrite /mythweb/(.+\.(php|pl))/.*      /mythweb/$1 last;
       rewrite /mythweb/(pl(/.*)?)$            /mythweb/mythweb.pl/$1 last;
       rewrite /mythweb/(.+)$                  /mythweb/mythweb.php/$1 last;
       rewrite /mythweb/(.*)$                  /mythweb/mythweb.php last;
   }

When using php-fpm you can also the php fpm instance to hold the configuration for the database and backend (the fastcgi_param's db_server, db_name, db_login, db_password). Entirely up to you.

How it works

For those that are interested, here's how all that hangs together.

First lets examine the first stanza.

   location /mythweb/ {
       auth_basic		"MythWeb";
       auth_basic_user_file	mythweb.passwd;
       index /mythweb/mythweb.php;
       try_files $uri @handler;
   }

auth_basic and auth_basic_user_file provide our authentication for mythweb. index tells nginx which file to select when just the directory /mythweb is requested.

Then the nginx magic starts.

The try_files line makes nginx try to find a file that directly matches the url being requested For example the mythtv logo is found at /mythweb/skins/default/img/mythtv-logo.png. nginx will find this file and directly return the content. Anything which cannot be found gets passed to the @handler stanza which we will look at later.


Now for the second stanza

   location ~ /mythweb/.+\.php {
       include         fastcgi_params;
       fastcgi_index   mythweb.php;
       fastcgi_split_path_info ^(.+\.php)(/?.+)$;
       fastcgi_param   SCRIPT_FILENAME	$document_root$fastcgi_script_name;
       fastcgi_param   PATH_INFO $fastcgi_path_info;
       fastcgi_param   db_server localhost;
       fastcgi_param   db_name  mythconverg;
       fastcgi_param   db_login mythtv;
       fastcgi_param   db_password mythtv;
       fastcgi_param   hostname mymythbox;
       fastcgi_pass    127.0.0.1:9000;
   }

This tells nginx that anything which matches the regexp "/mythweb/.+\.php" should be passed onto the php backend for interpretation.

The include file fastcgi_params is the one shipped with the nginx package and contains all the recommended fastcgi params.

fastcgi_split_path_info tells nginx how to split up the request url to correctly populate the variable $fastcgi_path_info. We need this to set PATH_INFO. If the PHP variable $_SERVER['PATH_INFO'] isn't correctly set, then the whole of mythweb fails to work. Both Apache and lighttpd set this variable out of the box. The nginx folk consider PATH_INFO depreciated and that the application should do it's magic based upon the request url instead. Until that time, we have to go and set the PATH_INFO variable correctly :)

/etc/nginx/mythweb.passwd

You will also need to create /etc/nginx/mythweb.passwd. This is a standard apache style htpasswd file and should contain the username/passwords for authenticating logons to your mythweb install.

Rewrite Rules

    location /mythweb/ {
           root /var/www/html;
          # The two Auth Lines assume that you want to password protect - which is recommended
           auth_basic          "Restricted";
          # Supports a standard htpasswd file, which defaults to the same directory as nginx.conf
           auth_basic_user_file htpasswd;
           if (!-e $request_filename) {
        rewrite  ^/mythweb/(pl(/.*)?)$        /mythweb/mythweb.pl?PATH_INFO=/$1 last;
        rewrite   ^/mythweb/(.+)$            /mythweb/mythweb.php?PATH_INFO=/$1 last;
               }
           if (!-f $request_filename) {
           rewrite     ^/mythweb/(.*)$                  /mythweb/mythweb.php last;
                }
            }

See Also