Apache mengalihkan ke port lain


151

Saya telah berjuang dengan ini selama beberapa waktu dan saya pasti melakukan sesuatu yang salah.

Saya memiliki server apache dan server JBoss di mesin yang sama. Saya ingin mengarahkan lalu lintas untuk mydomain.com ke JBoss localhost: 8080 / contoh. DNS saat ini disiapkan untuk mydomain.com dan akan langsung menuju port 80 ketika dimasukkan ke browser.

Pertanyaan saya adalah bagaimana cara mengalihkan ke port yang berbeda ketika nama domain tertentu datang ke apache (dalam hal ini, "mydomain.com")?

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

DIPERBARUI w / Saran - Masih tidak meneruskan ke port 8080

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

Itu terlihat cukup bagus. Apa gejalanya?
Martin Vilcans

Sympotms yang saya masukkan www.mydomain.com di browser tetapi dan itu pergi ke direktori root apache. Sebagai gantinya, saya ingin untuk mengarahkan ulang ke localhost subdirektori jboss: 8080 / subdir. Saat ini saya memilikinya bekerja untuk mengarahkan berbagai domain langsung ke port 80, tetapi tidak bisa mendapatkannya untuk pergi ke port lain.
agentcurry

Saya memiliki permintaan yang sama persis: apakah Anda menemukan solusi?
Cystack

1
@Cystack - Saya tidak bisa membuatnya bekerja. Saya mencoba banyak variasi konfigurasi sehingga membuat saya gila. Saya menyerah padanya = / Jika Anda menemukan solusi, silakan posting di sini, saya ingin tahu bagaimana cara membuatnya bekerja. semoga berhasil teman saya!
agentcurry

Ini bekerja untuk saya: serverfault.com/a/195831/111707
jjrv

Jawaban:


224

Anda harus meninggalkan domain http://example.comdi ProxyPass dan ProxyPassReverse dan biarkan sebagai /. Selain itu, Anda harus meninggalkan /bagian akhir di example/tempat pengarahan ulang. Juga, saya punya beberapa masalah dengan http://example.comvs. http://www.example.com- hanya www yang berfungsi sampai saya membuat ServerName www.example.com, dan ServerAlias ​​example.com. Coba ikuti langkah berikut.

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

Setelah Anda melakukan perubahan ini, tambahkan modul yang diperlukan dan mulai ulang apache

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

9
aktifkan modul apache sebelum memulai ulang apache - digitalocean.com/community/tutorials/…
Pradyut Bhattacharya

1
Apakah ini sama dengan server CentOS? (Saya tidak mengerti mengapa tidak, hanya memastikan). Dan, file konfigurasi apa ini? (di suatu tempat di / etc / httpd / conf saya kira ...)
Jeremy

1
Itu berhasil, tetapi saya melihat bahwa di halaman pembuka aplikasi saya, css tidak dimuat (yang sebelumnya berfungsi di example.com:8080/example). dan juga mendapat beberapa pengecualian. tahu apa yang saya lewatkan?
Rajarshee Mitra

1
ini menyebabkan kesalahan "Layanan Tidak Tersedia" di httpd saya sampai saya melakukannya/usr/sbin/setsebool -P httpd_can_network_connect 1
vladkras

@vladkras Terima kasih banyak atas tipnya, sangat membantu!
mneute

28

Saya memecahkan masalah ini dengan kode berikut:

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

Saya juga menggunakan:

a2enmod proxy_http

10

Saya ingin melakukan ini sehingga saya dapat mengakses Jenkins dari domain root.

Saya menemukan saya harus menonaktifkan situs default agar ini berfungsi. Inilah yang saya lakukan.

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

Dan masukkan ini ke file:

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

Selanjutnya Anda perlu mengaktifkan / menonaktifkan situs yang sesuai:

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

Semoga ini bisa membantu seseorang.


Terima kasih telah berkontribusi pada @Louth. Saya sudah lama menyerah dan tidak lagi memiliki server. Masih mengganggu saya bahwa saya tidak pernah membuatnya berfungsi, saya dapat memulai server baru hanya untuk menguji lagi. Terima kasih lagi, saya pasti akan memperbarui jika / ketika saya mencoba ini lagi.
agentcurry

Wiki Jenkins menjelaskan cara menjalankan Jenkins di belakang Apache: wiki.jenkins-ci.org/display/JENKINS/…
mneute

6

Menemukan ini karena coba-coba. Jika konfigurasi Anda menentukan ServerName, maka arahan VirtualHost Anda perlu melakukan hal yang sama. Dalam contoh berikut, awesome.example.com dan amazing.example.com akan diteruskan ke beberapa layanan lokal yang berjalan pada 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>

Saya tahu ini tidak menjawab pertanyaan, tapi saya taruh di sini karena ini adalah hasil pencarian teratas untuk penerusan port Apache. Jadi saya pikir itu akan membantu seseorang suatu hari nanti.


Ini adalah satu-satunya yang bekerja untuk saya. Menggunakan *:80bukannya example.com:80berarti bahwa port tidak akan dialihkan.
Seb123

4

Anda harus memastikan bahwa proxy diaktifkan di server. Anda dapat melakukannya dengan menggunakan perintah berikut:

  a2enmod proxy
  a2enmod proxy_http

  service apache2 restart

3

Ini mungkin pertanyaan lama, tapi inilah yang saya lakukan:

Dalam file .conf yang dimuat oleh apache:

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

Penjelasan: Dengarkan semua permintaan ke port mesin lokal 80. Jika saya meminta " http://something.com/somethingorother", teruskan permintaan itu ke " http://localhost:8080/somethingorother". Ini harus berfungsi untuk pengunjung eksternal karena, menurut dokumen, ini memetakan permintaan jarak jauh ke ruang server lokal.

Saya menjalankan Apache 2.4.6-2ubuntu2.2, jadi saya tidak yakin bagaimana "-2ubuntu2.2" mempengaruhi penerapan yang lebih luas dari jawaban ini.

Setelah Anda melakukan perubahan ini, tambahkan modul yang diperlukan dan mulai ulang apache

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

2

Jika Anda tidak harus menggunakan proxy ke JBoss dan mydomain.com:8080 dapat "diekspos" ke dunia, maka saya akan melakukan ini.

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

Menggunakan port selain 80 tidak hanya terlihat jelek, tetapi juga dapat menyebabkan masalah dengan server proxy atau ISP. Jika demikian, hapus saja Apache dan jalankan JBoss di port 80!
Martin Vilcans

Menjalankan semua yang ada di bawah JBoss adalah sebuah opsi, saya hanya mencoba untuk menghindari memindahkan situs apache ke JBoss, tetapi seharusnya tidak terlalu memakan waktu. Terima kasih untuk umpan baliknya.
agentcurry


1

Apache saya mendengarkan 2 port yang berbeda,

Listen 8080
Listen 80  

Saya menggunakan 80 ketika saya ingin URL transparan dan tidak meletakkan port setelah URL berguna untuk layanan google yang tidak akan mengizinkan url lokal?

Tetapi saya menggunakan 8080 untuk pengembangan internal di mana saya menggunakan port sebagai referensi untuk "lingkungan dev"


0

Apache mendukung host virtual berbasis nama dan IP. Sepertinya Anda menggunakan keduanya, yang mungkin bukan yang Anda butuhkan.

Saya pikir Anda benar-benar mencoba mengatur hosting virtual berbasis nama , dan untuk itu Anda tidak perlu menentukan alamat IP.

Coba <VirtualHost *: 80> untuk mengikat ke semua alamat IP, kecuali jika Anda benar-benar menginginkan hosting virtual berbasis ip . Ini mungkin terjadi jika server memiliki beberapa alamat IP, dan Anda ingin melayani situs yang berbeda pada alamat yang berbeda. Setup paling umum adalah (saya kira) nama host virtual berbasis.


Masuk akal, berdasarkan nama adalah semua yang saya butuhkan. Saya mengubahnya tetapi tetap saja tidak merutekan ke port lain
agentcurry

0

Anda membutuhkan 2 hal:

  1. Tambahkan ServerAlias www.mydomain.comke konfigurasi Anda
  2. ubah proxypass Anda menjadi ProxyPassMatch ^(.*)$ http://localhost:8080/example$1, agar mod_dir dan trailing slash tidak ikut campur.

Saya menambahkan ServerAlias ​​tetapi masih belum berhasil.
agentcurry

0

Semuanya adalah wawasan yang sangat baik untuk mengakses porta melalui nama domain pada server virtual. Namun, jangan lupa untuk mengaktifkan server virtual; ini dapat dikomentari:

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

Kami menjalankan WSGI dengan server Apache di domain sxxxx.com dan server golang berjalan pada port 6800. Beberapa firewall sepertinya memblokir nama domain dengan port. Ini solusi kami:

<VirtualHost *:80>
 ProxyPreserveHost On
 ProxyRequests Off
 ServerName wsgi.sxxxx.com
 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>

0

Ini juga berfungsi di ISPConfig. Dalam daftar situs web masuk ke dalam domain, klik ke tab Opsi, tambahkan baris ini:;

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

Lalu buka situs web dan wolaa :) Ini juga berfungsi protokol HTTPS.


0

Coba yang ini-

<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> 
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.