404 error on homepage when using Nginx proxying to Apache

I generally use Nginx to serve static content on my server, with Apache handling PHP content using PHP-FPM. However, I’m not able to get a WordPress blog homepage to display and I’ve tried all the configuration examples I can find on the web without much luck.

Here is my Nginx config:

Read More
server {

        listen   XXX.XXX.XXX.XXX:80;
        server_name wptest.mydomain.com;

    access_log  /var/log/nginx/testblog_access.log combined;
    error_log /var/log/nginx/testblog-error.log;

    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    location / {
                    proxy_pass http://127.0.0.1:80;
    }

    location = /50x.html {
            root   /var/www/nginx-default;
    }

    # No access to .htaccess files.
    location ~ /.ht {
            deny  all;
    }

}

My Apache config is as follows:

<VirtualHost 127.0.0.1>
    ServerName wptest.mydomain.com
    ServerAdmin webmaster@mydomain.com
    LogLevel warn
    ErrorLog /var/log/apache2/testblog-error.log
    CustomLog /var/log/apache2/testblog-access.log combined

    Options +FollowSymLinks +ExecCGI -Indexes -MultiViews
    AddHandler php-fastcgi .php
    Action php-fastcgi /wordpress
    Alias /wordpress /var/www/wordpress
    FastCgiExternalServer /var/www/wordpress -host 127.0.0.1:9000
    RewriteEngine on

    DocumentRoot /var/www/wordpress
    DirectoryIndex index.php

                    <Directory />
                            DirectoryIndex index.php
                            AllowOverride All
                            Options +FollowSymLinks +ExecCGI +SymLinksIfOwnerMatch
                    </Directory>

                    <Directory /var/www/wordpress>
                            AllowOverride All
                            Options +FollowSymLinks +ExecCGI +SymLinksIfOwnerMatch
                    </Directory>
</VirtualHost>

I am not able to view “http://wptest.mydomain.com/” or “http://wptest.mydomain.com/wp-admin” but “http://wptest.mydomain.com/wp-login.php” does work. What am I doing wrong?

Version information:
+ OS: Debian 5/Lenny
+ Apache: 2.2.9
+ Nginx: 0.7.65
+ WordPress: 3.1.2

Related posts

Leave a Reply

3 comments

  1. Both servers are listening to the same port. You have Nginx set to listen to 80 and nothing is set for Apache unless it’s in your ports.conf.

    Your also proxy passing to Apache port 80 in your Nginx conf.

    In the Nginx conf change

    proxy_pass http://127.0.0.1:80;

    to

    proxy_pass http://127.0.0.1:9000;

    change listen XXX.XXX.XXX.XXX:80; to listen 80;

    In your Vhosts

    add

    NameVirtualHost *:9000
    Listen 9000
    

    Above the <VirtualHost> tag or in the ports.conf file (If you have other vhost that don’t use Nginx add it to the top of your vhost. Change virtual host to look like this:

    <VirtualHost *9000>

  2. I copied your config and I got those 404s. It seems like you have mixed up fastcgi and Apache is confused where to find fastcgi and WordPress. As soon as I separated the fastcgi binary from WordPress I was able to make it work. In my setup I had WordPress was installed in /var/www/wordpress which is out of document root, my document root was something out of /var. But I could access WordPress as http://domain.com/wordpress/ because of following Alias.

    Alias /wordpress /var/www/wordpress
    

    Then I created a fastcgi directory outside of WordPress in /var/www so it will be

    mkdir /var/www/fastcgi
    

    Then I linked the php5-cgi binary to this directory:

    ln -s /usr/bin/php5-cgi /var/www/fastcgi/
    

    I separated the php5-cgi because I don’t like the idea of having a binary file under the directory accessible via web server.

    Then I config my Apache as follows:

    Alias /wordpress /var/www/wordpress
    Alias /fastcgi   /var/www/fastcgi
    
    FastCgiExternalServer /var/www/fastcgi -host 127.0.0.1:9000
    <Directory /var/www/wordpress>
        AllowOverride All
        AddHandler php-fastcgi .php
        Action php-fastcgi /fastcgi/php5-cgi
        AddType application/x-httpd-php .php
        DirectoryIndex index.php
    
       Options +FollowSymLinks +ExecCGI +SymLinksIfOwnerMatch
    </Directory>
    
    <Location /fastcgi>
        SetHandler fcgid-script
        Options +ExecCGI
    </Location>
    

    And it started working. Hope this will help you fix your Apache config, let me know if there is anything wrong.

  3. I don’t know whether I should be proud or embarrassed that I’m coming back to answer my own question more than a year later. So, I finally found some time to work on this issue today and managed to get this configuration working. Turns out there were a few missing statements in my original configuration, but the critical change was in wp-config.php. To pull everything together, starting off with my nginx config (which is almost entirely lifted from the nginx wiki):

    server {
    
            listen   XXX.XXX.XXX.XXX:80;
            server_name wptest.mydomain.com;
            error_log /var/log/nginx/wp-error.log;
    
            ## Your only path reference.
            root /var/www/wordpress;
            ## This should be in your http block and if it is, it's not needed here.
            index index.php;
    
            location = /favicon.ico {
                    log_not_found off;
                    access_log off;
            }
    
            location = /robots.txt {
                    allow all;
                    log_not_found off;
                    access_log off;
            }
    
            location / {
                    # This is cool because no php is touched for static content.
                    # include the "?$args" part so non-default permalinks doesn't break when using query string
                    try_files $uri $uri/ /index.php?$args;
            }
    
            location ~ .php$ {
                    proxy_set_header X-Real-IP  $remote_addr;
                    proxy_set_header Host $host;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_pass http://127.0.0.1:80;
            }
    
            location ~* .(js|css|png|jpg|jpeg|gif|ico)$ {
                    expires max;
                    log_not_found off;
            }
    
    }
    

    Next up, my Apache config:

    <VirtualHost 127.0.0.1>
            server_name wptest.mydomain.com
            ServerAdmin webmaster@mydomain.com
            LogLevel warn
            ErrorLog /var/log/apache2/wp-error.log
            CustomLog /var/log/apache2/wp-access.log combined
    
            AddType application/x-httpd-fastphp .php
            AddHandler php-fastcgi .php
            Action php-fastcgi /fastcgi
            Alias /fastcgi /var/www/wordpress
            FastCgiExternalServer /var/www/wordpress -host 127.0.0.1:9000
    
                            DocumentRoot /var/www/wordpress
    
                            #Site Directives
                            RewriteEngine on
                            Options +FollowSymLinks +ExecCGI -Indexes -MultiViews
    
                            <Directory />
                              AllowOverride None
                            </Directory>
    
                            <Directory /var/www/wordpress/>
                                    AllowOverride Limit FileInfo AuthConfig
                                    order allow,deny
                                    allow from all
                            </Directory>
    
    </VirtualHost>
    

    Finally, the one extra line in the wp-config.php file that makes it all work (Taken from the Codex)

    $_SERVER['HTTP_HOST'] = $_SERVER['HTTP_X_FORWARDED_HOST'];
    

    With this configuration, I have tested that pretty permalinks via .htaccess works correctly.