Nginx configuration for a wordpress blog in a subfolder of magento root

I have installed a Magento extension to have a wordpress blog integrated with Magento.
Basically, the WP is in a subdirectory of the Magento root. I want to create multiple sites with subdirectories but I can’t make it work due to the nginx configuration.

WordPress is in his /wp subdirectory (http://example.com/wp/wp-admin/) and the others sites are accessible from http://example.com/wp/ca/wp-admin/ and http://example.com/wp/en/wp-admin/

Read More

Here is whats I got so far :

server
{
    server_name dev.example.com;
    access_log /var/log/nginx/example.access.log;-
    error_log /var/log/nginx/example.error.log;
    root /var/www/example;

    location ^~ /wp {
        index index.php index.html index.htm;
        try_files $uri $uri/ /wp/index.php?q=$uri&$args;

        # Multisite
        if (!-e $request_filename) {
            rewrite /wp-admin$ $scheme://$host$uri/ permanent;         
            rewrite ^/wp(/[^/]+)?(/wp-.*) /wp$2 last;      
            rewrite ^/wp(/[^/]+)?(/.*.php)$ /wp$2 last;
        }

        location ~ .php$ {
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $request_filename;
            fastcgi_pass 127.0.0.1:9000;
        }   
    }  

    set             $mage_developer true;
    set             $mage_code es; 
    set             $mage_type store;
    include         snippets.d/magento-site;-
}

and in snippets.d/magento-site :

# Serve static pages directly,
# otherwise pass the URI to Magento's front handler
location / {
    index       index.php;
    try_files   $uri $uri/ @handler;
    expires     30d;-
}

# Disable .htaccess and other hidden files
location  /. {
    return 404;
}

# Allow admins only to view export folder
location /var/export/ {
    auth_basic               "Restricted";
    auth_basic_user_file     htpasswd;
    autoindex                on; 
}

# These locations would be hidden by .htaccess normally
location /app/                { deny all; }
location /includes/           { deny all; }
location /lib/                { deny all; }
location /media/downloadable/ { deny all; }
location /pkginfo/            { deny all; }
location /report/config.xml   { deny all; }
location /var/                { deny all; }

# Magento uses a common front handler
location @handler {
    rewrite / /index.php;
}

# Forward paths like /js/index.php/x.js to relevant handler
location ~ .php/ {
    rewrite ^(.*.php)/ $1 last;
}

# Execute PHP scripts
location ~ .php$ {

    # Catch 404s that try_files miss
    if (!-e $request_filename) { rewrite / /index.php last; }

    expires        off;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;
    fastcgi_param  MAGE_RUN_CODE $mage_code;
    fastcgi_param  MAGE_RUN_TYPE $mage_type;
    fastcgi_ignore_client_abort on;
    fastcgi_read_timeout 900s; # 15 minutes
}

Thanks for your help.

Related posts

Leave a Reply

3 comments

  1. Wanted to pass along a full conf file for anyone who needs to configure this. Please keep in mind, many file paths are unique your your server configuration.

    Please note, you’ll need to adjust the following parameters based on file paths on your server:

    server_name domain.com www.domain.com;
    ssl_certificate       /sslpath/domain.com.crt;
    ssl_certificate_key  /sslpath/domain.com.key;
    root      /webrootpath/domain.com;
    rewrite ^/blogpath(.*) /blogpath/index.php?q=$1;
    location ^~ /blogpath {
    error_log /data/log/nginx/domain.com_error.log;
    access_log /data/log/nginx/domain.com_access.log;
    

    Here is the full nginx conf file:

    server {
       listen      80;
       server_name domain.com www.domain.com;
       rewrite     ^   https://$server_name$request_uri? permanent;
    }
    
    server {
       listen 443;
       server_name domain.com www.domain.com;
    
       ssl on;
       ssl_certificate       /sslpath/domain.com.crt;
       ssl_certificate_key  /sslpath/domain.com.key;
       ssl_session_timeout 30m;
    
    root      /webrootpath/domain.com;
    index     index.php;
    location / {
       index index.html index.php;
       try_files $uri $uri/ @handler;
       expires 30d;
    }
    
    location @wp {
       rewrite ^/blogpath(.*) /blogpath/index.php?q=$1;
    }
    
    location ^~ /blogpath {
       root /webrootpath/domain.com;
       index index.php index.html index.htm;
       try_files $uri $uri/ @wp;
    
    location ~ .php$ {
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $request_filename;
        fastcgi_pass 127.0.0.1:9000;
    }
    } 
    
    location ~    ^/(app|includes|lib|media/downloadable|pkginfo|report/config.xml|var)/ { internal; }
    location /var/export/ { internal; }
    location /. { return 404; }
    location @handler { rewrite / /index.php; }
    location ~* .php/ { rewrite ^(.*.php)/ $1 last; }
    location ~* .php$ {
       if (!-e $request_filename) { rewrite / /index.php last; }
       expires off;
       fastcgi_pass 127.0.0.1:9000;
       fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
       fastcgi_param MAGE_RUN_CODE default;
       fastcgi_param MAGE_RUN_TYPE store;
       include fastcgi_params;
    }
    
    error_log /data/log/nginx/domain.com_error.log;
    access_log /data/log/nginx/domain.com_access.log;
    
    }
    
  2. Well, in the end, it works passing all request to the blog to Apache and creating the site in the virtual hosts corresponding.

    location ~ ^/blog {
     proxy_pass          http://apache:80;
     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_read_timeout  6000s;
    }
    

    If someone succeed to make it work with Nginx only, I’m looking forward to his answer 🙂

  3. Why run Apache? Doesn’t make sense to run 2 webservers.
    Try adding this to your nginx conf.

    location @wp {
    rewrite ^/wp(.*) /wp/index.php?q=$1;
    }
    
    location ^~ /wp {
    root /var/www/example;
    index index.php index.html index.htm;
    try_files $uri $uri/ @wp;
    
    location ~ .php$ {
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $request_filename;
        fastcgi_pass 127.0.0.1:9000;
    }
    }