agentcurry
agentcurry

Reputation: 2455

Apache redirect to another port

I've struggled with this for some time and am definitely doing something wrong.

I have Apache server and a JBoss server on the same machine. I'd like to redirect traffic for mydomain.example to JBoss localhost:8080/example. The DNS is currently setup for mydomain.example and it will go straight to port 80 when entered into the browser.

My question is how do I redirect to a different port when a certain domain name comes to Apache (in this case, mydomain.example)?

<VirtualHost ip.addr.is.here>
  ProxyPreserveHost On
  ProxyRequests Off
  ServerName mydomain.example
  ProxyPass http://mydomain.example http://localhost:8080/example
  ProxyPassReverse http://mydomain.example http://localhost:8080/example
</VirtualHost>

After implementing some suggestions:

Upvotes: 191

Views: 449521

Answers (16)

FlexMcMurphy
FlexMcMurphy

Reputation: 523

When matching a server name and alias, apache2 processes virtual hosts in order based on the name of the file they are defined in.

The rules are defined in the apache2 documentation. Numbers and alphabetical precedence in the file names are important.

Example order of processing by apache2:

1st ----> 1virtualhost  
2nd ----> avirtualhost  
3rd ----> reverseproxyvirtualhost

It is worth checking the file name of your virtual host files if you have more than one. Otherwise you might spend hours trying different things in a virtual host file that Apache never processes because it already matched on a virtual host in another file.

Don't know if this was the OP's problem but it is a possibility.

Upvotes: 0

This might be an old question, but here's what I did:

In a .conf file loaded by Apache:

<VirtualHost *:80>
  ServerName something.com
  ProxyPass / http://localhost:8080/
</VirtualHost>

Explanation: Listen on all requests to the local machine's port 80. If I requested "http://something.com/somethingorother", forward that request to "http://localhost:8080/somethingorother". This should work for an external visitor because, according to the docs, it maps the remote request to the local server's space.

I'm running Apache 2.4.6-2ubuntu2.2, so I'm not sure how the "-2ubuntu2.2" affects the wider applicability of this answer.

Upvotes: 10

Jon Lin
Jon Lin

Reputation: 143936

You need 2 things:

  1. Add a ServerAlias www.mydomain.example to your config
  2. change your proxypass to ProxyPassMatch ^(.*)$ http://localhost:8080/example$1, to possibly keep mod_dir and trailing slashes from interfering.

Upvotes: 1

user2099484
user2099484

Reputation: 4559

All are excellent insights to accessing ports via domain names on virtual servers. Do not forget, however, to enable virtual servers; this may be commented out:

NameVirtualHost *:80
<Directory "/home/dawba/www/">
 allow from all
</Directory>

We run WSGI with an Apache server at the domain sxxxx.com and a golang server running on port 6800. Some firewalls seem to block domain names with ports. This was our solution:

<VirtualHost *:80>
 ProxyPreserveHost On
 ProxyRequests Off
 ServerName wsgi.sxxxx.example
 DocumentRoot "/home/dxxxx/www"
  <Directory "/home/dxxx/www">
    Options Indexes FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
  </Directory>
 ScriptAlias /py/ "/home/dxxxx/www/py/"
 WSGIScriptAlias /wsgiprog /home/dxxxx/www/wsgiprog/Form/Start.wsgi
</VirtualHost>

<VirtualHost *:80>
 ProxyPreserveHost On
 ProxyRequests Off
 ServerName sxxxx.com
 ServerAlias www.sxxxx.com
 ProxyPass / http://localhost:6800/
 ProxyPassReverse / http://localhost:6800/
</VirtualHost>

Upvotes: 0

Michael Rice
Michael Rice

Reputation: 1183

If you don't have to use a proxy to JBoss and mydomain.example:8080 can be "exposed" to the world, then I would do this.

<VirtualHost *:80>
  ServerName mydomain.example
  Redirect 301 / http://mydomain.example:8080/
</VirtualHost>

Upvotes: 3

Louth
Louth

Reputation: 12393

I wanted to do exactly this so I could access Jenkins from the root domain.

I found I had to disable the default site to get this to work. Here's exactly what I did.

$ sudo vi /etc/apache2/sites-available/jenkins

And insert this into file:

<VirtualHost *:80>
  ProxyPreserveHost On
  ProxyRequests Off
  ServerName mydomain.example
  ServerAlias mydomain
  ProxyPass / http://localhost:8080/
  ProxyPassReverse / http://localhost:8080/
  <Proxy *>
        Order deny,allow
        Allow from all
  </Proxy>
</VirtualHost>

Next you need to enable/disable the appropriate sites:

$ sudo a2ensite jenkins
$ sudo a2dissite default
$ sudo service apache2 reload

Upvotes: 13

Renan Vizza
Renan Vizza

Reputation: 321

I solved this issue with the following code:

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
<VirtualHost *:80>
ProxyPreserveHost On
ProxyRequests Off
ServerName myhost.example
ServerAlias www.myhost.example
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
</VirtualHost>

I also used:

a2enmod proxy_http

Upvotes: 32

Rcee
Rcee

Reputation: 11

This is how I redirected part of the requests to one url and rest to another url:

<VirtualHost *:80>
  ProxyPreserveHost On
  ProxyRequests Off
  ServerName localhost
  ProxyPass /context/static/content http://localhost:80/web/
  ProxyPassReverse /context/static/content http://localhost:80/web/
  ProxyPass / http://localhost:8080/
  ProxyPassReverse / http://localhost:8080/
</VirtualHost>

Upvotes: 0

Ankit Kumar Rajpoot
Ankit Kumar Rajpoot

Reputation: 5600

Try this one-

<VirtualHost *:80> 
  ProxyPreserveHost On
  ProxyRequests Off
  ServerName www.adminbackend.example.com
  ServerAlias adminbackend.example.com
  ProxyPass / http://localhost:6000/
  ProxyPassReverse / http://localhost:6000/
  ErrorLog ${APACHE_LOG_DIR}/error.log
  CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost> 

Upvotes: 0

2AMTech
2AMTech

Reputation: 2924

You should leave out the domain http://example.com in ProxyPass and ProxyPassReverse and leave it as /. Additionally, you need to leave the / at the end of example/ to where it is redirecting. Also, I had some trouble with http://example.com vs. http://www.example.com - only the www worked until I made the ServerName www.example.com, and the ServerAlias example.com. Give the following a go.

<VirtualHost *:80> 
  ProxyPreserveHost On
  ProxyRequests Off
  ServerName www.example.com
  ServerAlias example.com
  ProxyPass / http://localhost:8080/example/
  ProxyPassReverse / http://localhost:8080/example/
</VirtualHost> 

After you make these changes, add the needed modules and restart apache

sudo a2enmod proxy && sudo a2enmod proxy_http && sudo service apache2 restart

Upvotes: 280

kodmanyagha
kodmanyagha

Reputation: 995

This is working in ISPConfig too. In website list get inside a domain, click to Options tab, add these lines: ;

ProxyPass / http://localhost:8181/
ProxyPassReverse / http://localhost:8181/

Then go to website and wolaa :) This is working HTTPS protocol too.

Upvotes: 0

Miguel Q
Miguel Q

Reputation: 3628

My apache listens to 2 different ports,

Listen 8080
Listen 80  

I use the 80 when i want a transparent URL and do not put the port after the URL useful for google services that wont allow local url?

But i use the 8080 for internal developing where i use the port as a reference for a "dev environment"

Upvotes: 1

Aswin Mohanan
Aswin Mohanan

Reputation: 151

You have to make sure that the proxy is enabled on the server. You can do so by using the following commands:

  a2enmod proxy
  a2enmod proxy_http

  service apache2 restart

Upvotes: 6

Ethan B Martin
Ethan B Martin

Reputation: 384

Found this out by trial and error. If your configuration specifies a ServerName, then your VirtualHost directive will need to do the same. In the following example, awesome.example.com and amazing.example.com would both be forwarded to some local service running on port 4567.

ServerName example.com:80

<VirtualHost example.com:80>
  ProxyPreserveHost On
  ProxyRequests Off
  ServerName awesome.example.com
  ServerAlias amazing.example.com
  ProxyPass / http://localhost:4567/
  ProxyPassReverse / http://localhost:4567/
</VirtualHost>

I know this doesn't exactly answer the question, but I'm putting it here because this is the top search result for Apache port forwarding. So I figure it'll help somebody someday.

Upvotes: 6

Julian Dehne
Julian Dehne

Reputation: 83

Just use a Reverse Proxy in your apache configuration (directly):

ProxyPass /foo http://foo.example.com/bar
ProxyPassReverse /foo http://foo.example.com/bar

Look here for apache documentation of how to use the mod

Upvotes: 2

Martin Vilcans
Martin Vilcans

Reputation: 5738

Apache supports name based and IP based virtual hosts. It looks like you are using both, which is probably not what you need.

I think you're actually trying to set up name-based virtual hosting, and for that you don't need to specify the IP address.

Try < VirtualHost *:80> to bind to all IP addresses, unless you really want ip based virtual hosting. This may be the case if the server has several IP addresses, and you want to serve different sites on different addresses. The most common setup is (I would guess) name based virtual hosts.

Upvotes: 0

Related Questions