Skip to content

Instantly share code, notes, and snippets.

@chrisjhoughton
Last active July 18, 2025 14:00
Show Gist options
  • Save chrisjhoughton/8646918 to your computer and use it in GitHub Desktop.
Save chrisjhoughton/8646918 to your computer and use it in GitHub Desktop.
Sample Nginx reverse proxy to Apache set up for Wordpress.
<VirtualHost *:{PORT}>
ServerName www.yourdomain.com
ServerAdmin [email protected]
DocumentRoot /var/www/yourdir/
<Directory /var/www/yourdir>
Options Indexes FollowSymLinks
AllowOverride all
Order allow,deny
allow from all
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
# Add this file to your /etc/nginx/sites-available directory, renaming it to
# the domain of your website.
# Change the: server_name, port
# Credit to http://mattkirman.com/2011/06/01/how-to-speed-up-wordpress-with-nginx/.
server {
listen 80;
server_name www.yourdomain.com; # change this
# global gzip on
gzip on;
gzip_min_length 10240;
gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml;
gzip_disable "MSIE [1-6]\.";
add_header Cache-Control public;
location / {
proxy_pass http://127.0.0.1:{PORT}; # change this
proxy_buffering on;
proxy_buffers 12 12k;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
}
}
<?php
// Add this to the top of your wp-config.php file.
// Handle reverse proxy, passing the IP to the server.
// This is used by some plugins to fetch the user's IP.
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
$_SERVER['REMOTE_ADDR'] = $ips[0];
}
?>
@sinabio
Copy link

sinabio commented Sep 5, 2019

When you put a ssl to domain certificate, it stops working.

@hyleck, did you find any solution for this?

use following code on wp-config.php

/**

  • Handle SSL reverse proxy
    */
    if ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
    $_SERVER['HTTPS']='on';

if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])) {
$_SERVER['HTTP_HOST'] = $_SERVER['HTTP_X_FORWARDED_HOST'];
}

@cornerstone-ccl
Copy link

I also want to enable https. I added the SSL reverse proxy code on wp-config.php (see below) but https still does not work. Any idea why? Your help is appreciated. Thanks

//Handle SSL reverse proxy
if ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
$_SERVER['HTTPS']='on';
if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])) {
$_SERVER['HTTP_HOST'] = $_SERVER['HTTP_X_FORWARDED_HOST'];
}

// Handle reverse proxy, passing the IP to the server.
// This is used by some plugins to fetch the user's IP.
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
$_SERVER['REMOTE_ADDR'] = $ips[0];
}

@teacherpan
Copy link

Must add $server_port to Host to avoid 301 loop error:

proxy_set_header Host $host:$server_port;

@serome111
Copy link

serome111 commented Aug 29, 2020

I also have a problem with the ssl does not work and when I enter the domain looks like this
example.com.co:81
Could someone please help me or explain what I am doing wrong?

  server_name example.com.co; # change this

  gzip on;
  gzip_min_length 10240;
  gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml;
  gzip_disable "MSIE [1-6]\.";

  add_header Cache-Control public;

  location / {
    proxy_set_header Host $host:$server_port;
    proxy_pass http://127.0.0.1:81/example; # change this
    proxy_buffering on;
    proxy_buffers 12 12k;
    proxy_redirect off;

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



    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/example.com.co/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/example.com.co/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}
server {
    if ($host = example.com.co) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


  listen 80;
  server_name example.com.co;
    return 404; # managed by Certbot


}
`

I'm just installing the wp-config.php so there is no such file.

@sandikodev
Copy link

greatt

@Masplus
Copy link

Masplus commented Feb 16, 2021

Must add $server_port to Host to avoid 301 loop error:

proxy_set_header Host $host:$server_port;

This was the absolute solution for my nightmare, just this :$server_port.
Thank you very much !

@tradenet
Copy link

Must add $server_port to Host to avoid 301 loop error:

proxy_set_header Host $host:$server_port;

This was the absolute solution for my nightmare, just this :$server_port. Thank you very much !

Interesting I did this and I get the loop.

@tradenet
Copy link

:$server_port

Hmmm...I moved this around to just after location. Seems to work now. Strange.

@mehdiMj-ir
Copy link

Hi, any suggestion how am I able to do this with in a subpath?
I want to serve it with /blog on nginx but static files like css & js won't load and I get 404 error.

@thanghoang89
Copy link

When I configure WordPress permalinks, I get a 500 error: 'Request exceeded the limit of 10 internal redirects due to probable configuration error.' Can anyone help?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment