Git Product home page Git Product logo

wordpress-nginx's Introduction

Nginx configuration for WordPress

Introduction

This is a nginx configuration for running WordPress.

It differs from the usual configuration, like the one available on the Nginx Wiki.

It makes use of nested locations with named capture groups instead of fastcgi_split_path_info.

This example configuration assumes that the site is called example.com. Change accordingly to reflect your server setup.

Features

  1. Filtering of invalid HTTP Host headers.

  2. Access to install files, like install.php, is protected using HTTP Basic Auth.

  3. Protection of all the internal directories, like version control repositories and the readme file(s) that come with WP or an external plugin.

  4. Faster and more secure handling of PHP FastCGI by Nginx using named groups in regular expressions instead of using fastcgi_split_path_info. Requires Nginx version ≥ 0.8.25.

  5. Compatible with the WordPress plugin wp-super-cache for serving static pages to anonymous users.

  6. Upload Progress support.

  7. Possibility of using Apache as a backend for dealing with PHP. Meaning using Nginx as reverse proxy.

  8. Operating system open files cache for static assets like CSS and JS, for example.

  9. FLV and H264/AAC pseudo streaming support.

    Note that for mp4 streaming to work properly, with seeking enabled, you must use a compatible player and run a Nginx version greater or equal to 1.1.3 for the development branch and 1.0.7 for the stable branch.

Basic Auth for access to restricted files like install.php

install.php and the WordPress readme.html are protected using Basic Auth. The readme file discloses the version number of WordPress.

Not only install.php, but any PHP file that has install.php as the ending is protected. This way if, for example, there's a permission problem with wp-config.php and WP can't read the file it will invoke install.php since it assumes that if no specific configuration information is available then the site must not yet be installed. Now imagine that this happens on your site and that someone stumbles on the install.php? If not protected by the Basic Auth, information disclosure would be the least potential problem.

You have to create the .htpasswd-users file with the user(s) and password(s). For that, if you're on Debian or any of its derivatives like Ubuntu you need the apache2-utils package installed. Then create your password file by issuing:

      htpasswd -d -b -c .htpasswd-users <user> <password>

You should delete this command from your shell history afterwards with history -d <command number> or alternatively omit the -b switch, then you'll be prompted for the password.

This creates the file (there's a -c switch). For adding additional users omit the -c.

Of course you can rename the password file to whatever you want, then accordingly change its name in the virtual host config file, example.com.

Nginx as a Reverse Proxy: Proxying to Apache for PHP

If you absolutely need to use the rather bad habit of deploying web apps relying on .htaccess, or you just want to use Nginx as a reverse proxy. The config allows you to do so. Note that this provides some benefits over using only Apache, since Nginx is much faster than Apache. Furthermore you can use the proxy cache and/or use Nginx as a load balancer.

IPv6 and IPv4

The configuration of the example vhosts uses separate sockets for IPv6 and IPv4. This way is simpler for those not (yet) having IPv6 support to disable it by commenting out the listen directive with the ipv6only=on parameter.

Note that the IPv6 address uses an IP stolen from the IPv6 Wikipedia page. You must replace the indicated address by your address.

Installation

  1. Move the old /etc/nginx directory to /etc/nginx.old.

  2. Clone the git repository from github:

    git clone https://github.com/perusio/wordpress-nginx.git

  3. Edit the sites-available/example.com.conf configuration file to suit your requirements. Namely replacing example.com with your domain.

  4. Setup the PHP handling method. It can be:

    • Upstream HTTP server like Apache with mod_php. To use this method comment out the include upstream_phpcgi.conf; line in nginx.conf and uncomment the lines:

      include reverse_proxy.conf;
      include upstream_phpapache.conf;
      

      Now you must set the proper address and port for your backend(s) in the upstream_phpapache.conf. By default it assumes the loopback 127.0.0.1 interface on port 8080. Adjust accordingly to reflect your setup.

      Comment out all fastcgi_pass directives in either drupal_boost.conf or drupal_boost_drush.conf, depending which config layout you're using. Uncomment out all the proxy_pass directives. They have a comment around them, stating these instructions.

    • FastCGI process using php-cgi. In this case an init script is required. This is how the server is configured out of the box. It uses UNIX sockets. You can use TCP sockets if you prefer.

    • PHP FPM, this requires you to configure your fpm setup, in Debian/Ubuntu this is done in the /etc/php5/fpm directory.

      Look here for an example configuration of php-fpm.

    Check that the socket is properly created and is listening. This can be done with netstat, like this for UNIX sockets:

    netstat --unix -l
    

    And like this for TCP sockets:

    netstat -t -l
    

    It should display the PHP CGI socket.

    Note that the default socket type is UNIX and the config assumes it to be listening on unix:/tmp/php-cgi/php-cgi.socket, if using the php-cgi, or in unix:/var/run/php-fpm.sock using php-fpm and that you should change to reflect your setup by editing upstream_phpcgi.conf.

  5. Create the /etc/nginx/sites-enabled directory and enable the virtual host using one of the methods described below.

    Note that if you're using the nginx_ensite script described below it creates the /etc/nginx/sites-enabled directory if it doesn't exist the first time you run it for enabling a site.

  6. Reload Nginx:

    /etc/init.d/nginx reload

  7. Check that WordPress is working by visiting the configured site in your browser.

  8. Remove the /etc/nginx.old directory.

  9. Done.

Enabling and Disabling Virtual Hosts

I've created a shell script nginx_ensite that lives here on github for quick enabling and disabling of virtual hosts.

If you're not using that script then you have to manually create the symlinks from sites-enabled to sites-available. Only the virtual hosts configured in sites-enabled will be available for Nginx to serve.

Acessing the php-fpm status and ping pages

You can get the status and a ping pages for the running instance of php-fpm. There's a php_fpm_status.conf file with the configuration for both features.

  • the status page at /fpm-status;

  • the ping page at /ping.

For obvious reasons these pages are acessed only from a given set of IP addresses. In the suggested configuration only from localhost and non-routable IPs of the 192.168.1.0 network.

The allowed hosts are defined in a geo block in file php_fpm_status_allowed_hosts.conf. You should edit the predefined IP addresses to suit your setup.

To enable the status and ping pages uncomment the line in the example.com.conf virtual host configuration file.

Getting the latest Nginx packaged for Debian or Ubuntu

I maintain a debian repository with the latest version of Nginx. This is packaged for Debian unstable or testing. The instructions for using the repository are presented on this page.

It may work or not on Ubuntu. Since Ubuntu seems to appreciate more finding semi-witty names for their releases instead of making clear what's the status of the software included. Is it stable? Is it testing? Is it unstable? The package may work with your currently installed environment or not. I don't have the faintest idea which release to advise. So you're on your own. Generally the APT machinery will sort out for you any dependencies issues that might exist.

My other Nginx configs on github

Securing your PHP configuration

I have created a small shell script that parses your php.ini and sets a sane environment, be it for development or production settings.

Grab it here.

Acknowledgments

Thanks to Burçe Boran for helping me sort out the issues of the configuration for supercache 0.9.9.9.

wordpress-nginx's People

Contributors

palcu avatar perusio avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

wordpress-nginx's Issues

WP Super Cache and Nginx GET parameters issue

Hello,

I'm having problems getting wp super cache to cache any pages other than the index page when I check "Don’t cache pages with GET parameters. (?x=y at the end of a url)" in the wp super cache settings.

I've copied your config files and everything else seems to be working fine. From reading about the problem, it looks like nginx is appending the URL as the GET parameter which is blocking WP Super Cache to cache the page. I'm not sure what config parameter to change.

Thanks

Domains Redirect to the first vhost

Hey,

I'm trying to use your Nginx configurations but when I've got more than one vhost enabled it seems to redirect my second domain to the first domain.

domain2.com redirect to domain1.com for some reason.

Any ideas?

Cheers,
Scott

Nginx rewrite for changing /wp-login.php to /login

Hi Perusio,

Firstly, thank you for the config. Not really an issue but was wondering what the nginx equivalent of the apache rewrite is -

RewriteRule ^login$ http://YOUR_SITE.com/wp-login.php [NC,L]

Thanks for the help

Jasmine

"if" directive not allowed wp_supercache.conf

I'm trying to setup a Wordpress site, running nginx 1.2.0 with php 5.3.13, php-fpm and WP Super Cache. My nginx config files are stored in /usr/local, with my vhost.conf and wp_supercache.conf stored in /conf/conf.d (rather than the default directory, sites-available, listed in your setup). I've changed the "include" paths at the end of my main config file to reflect this (include conf.d/*.conf;).

After doing all of this, restarting nginx, I get the following error:

"if" directive is not allowed here in /usr/local/nginx/conf/conf.d/wp_supercache.conf

When I look at the wp_supercache.conf, I see it does use the "if" directive a number of times. I understand from reading the nginx.org wiki ('"if" is evil') that I should be using the "try_files" directive instead. Unfortunately, my grasp of nginx isn't strong enough yet to rewrite wp_supercache.conf in the way they're suggesting.

Protecting /wp-admin and wp-login.php

I wish to protect the login to a set of restricted IP addreses. I attempted to do this, but seem to get redirect loops in certain situations.

Perhaps its conflicting with a WordPress security plugin to rename /wp-login.php to /login etc.

location ~ ^/(wp-admin|wp-login.php) {
allow 1.2.3.4;
deny all;
}

Could you include a set of rules for restricting the admin sections?

Thanks,

A

HTTP error when uploading assets.

This is a silly issue. The fix is a tad obvious. But others might run into this, so I thought I'd share. This happens in macOS with the default configuration, because there's no www-data user by default. For reference, I installed nginx with brew.


When uploading an image, Wordpress shows an HTTP error. The log is:

open() "/usr/local/var/run/nginx/client_body_temp/0000000001" failed (13: Permission denied)

So obviously, the problem is that I started nginx without sudo. (I like it that way.) If I sudo nginx I have the permission to write files to /usr/local/var/run/nginx/, so the upload works.

Even more obvious, the better solution is to start have a proper user for nginx:

# in nginx.conf
user www www;

The above applies to macOS. I'm not sure if in Linux www-data is preferred.

Dif with drupal nginx config

Is it possible that you could give me an idea of the difference between the Drupal config.

My server will mainly contain Drupal sites, but there will be 1 Wordpress site. Most seems to work out of the box, but some options dont, the first i found is wp-admin does not work. No worries, thats fixable. But i was hoping you could give me an idea of what would need to change, so i would know if it's better to handle wordpress trough its onw config in apps/wordpress.

thanks in advance.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.