Apache เปลี่ยนเส้นทางไปยังพอร์ตอื่น


151

ฉันเคยดิ้นรนกับสิ่งนี้มาระยะหนึ่งแล้วและฉันกำลังทำสิ่งที่ผิดอย่างแน่นอน

ฉันมีเซิร์ฟเวอร์ apache และเซิร์ฟเวอร์ JBoss ในเครื่องเดียวกัน ฉันต้องการเปลี่ยนเส้นทางปริมาณการใช้งานสำหรับ mydomain.com ไปยัง JBoss localhost: 8080 / ตัวอย่าง ขณะนี้ DNS ได้รับการตั้งค่าสำหรับ mydomain.com และจะตรงไปที่พอร์ต 80 เมื่อเข้าสู่เบราว์เซอร์

คำถามของฉันคือฉันจะเปลี่ยนเส้นทางไปยังพอร์ตอื่นได้อย่างไรเมื่อชื่อโดเมนบางชื่อมาถึง Apache (ในกรณีนี้คือ "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> 

อัปเดตด้วยคำแนะนำ - ยังไม่ส่งต่อไปยังพอร์ต 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> 

นั่นดูดีทีเดียว คุณมีอาการอะไร?
Martin Vilcans

Sympotms เป็นสิ่งที่ฉันใส่ www.mydomain.com ในเบราว์เซอร์ แต่และมันไปที่ apache root dir ฉันต้องการให้มันเปลี่ยนเส้นทางไปยังไดเรกทอรีย่อย jboss ในพื้นที่: 8080 / subdir ปัจจุบันนี้ฉันใช้งานเพื่อเปลี่ยนเส้นทางโดเมนต่างๆไปยังพอร์ต 80 ได้โดยตรง แต่ไม่สามารถไปที่พอร์ตอื่นได้
agentcurry

ฉันมีคำขอเดียวกัน: คุณหาทางแก้ปัญหาหรือไม่?
Cystack

1
@Cackack - ฉันไม่สามารถทำให้การทำงาน ฉันลองชุดรูปแบบมากมายเพื่อปรับแต่งมันทำให้ฉันบ้า ฉันยอมแพ้มัน = / หากคุณบังเอิญหาวิธีแก้ปัญหากรุณาโพสต์ไว้ที่นี่ฉันอยากจะรู้วิธีทำให้มันใช้งานได้ ขอให้โชคดีเพื่อนของฉัน!
agentcurry

สิ่งนี้ใช้ได้กับฉัน: serverfault.com/a/195831/111707
jjrv

คำตอบ:


224

คุณควรจะออกจากโดเมนhttp://example.comใน ProxyPass และ ProxyPassReverse /และปล่อยให้มันเป็น นอกจากนี้คุณต้องออกจาก/ที่ส่วนท้ายของexample/ไปยังที่ที่มีการเปลี่ยนเส้นทาง นอกจากนี้ฉันมีปัญหากับhttp://example.comvs. http://www.example.com- เฉพาะ www ที่ทำงานจนกว่าฉันจะสร้าง ServerName www.example.com และ ServerAlias ​​example.com ให้ไปต่อไปนี้

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

หลังจากคุณทำการเปลี่ยนแปลงเหล่านี้เพิ่มโมดูลที่จำเป็นและรีสตาร์ท apache

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

9
เปิดใช้งานโมดูล apache ก่อนเริ่ม apache ใหม่ - digitalocean.com/community/tutorials/…
Pradyut Bhattacharya

1
สิ่งนี้จะเหมือนกันสำหรับเซิร์ฟเวอร์ CentOS หรือไม่ (ฉันไม่เห็นว่าทำไมไม่เพียงแค่ทำให้แน่ใจ) และไฟล์ config นี้จะเป็นอะไร? (ที่ไหนสักแห่งใน / etc / httpd / conf ฉันคาดเดา ... )
Jeremy

1
มันใช้งานได้ แต่ฉันเห็นว่าในหน้าต้อนรับของแอปพลิเคชันของฉัน css นั้นไม่ได้โหลด (ซึ่งก่อนหน้านี้ทำงานบน example.com:8080/example) และยังมีข้อยกเว้นบางอย่าง ความคิดใด ๆ ที่ฉันหายไป?
Rajarshee Mitra

1
สิ่งนี้ทำให้เกิดข้อผิดพลาด "บริการไม่พร้อมใช้งาน" บน httpd ของฉันจนกว่าฉันจะทำ/usr/sbin/setsebool -P httpd_can_network_connect 1
vladkras

@ vladkras ขอบคุณมากสำหรับเคล็ดลับนั้นมีประโยชน์มาก!
mneute

28

ฉันแก้ไขปัญหานี้ด้วยรหัสต่อไปนี้:

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>

ฉันยังใช้:

a2enmod proxy_http

10

ฉันต้องการทำสิ่งนี้เพื่อให้ฉันสามารถเข้าถึงเจนกินส์จากโดเมนหลักได้

ฉันพบว่าฉันต้องปิดการใช้งานเว็บไซต์เริ่มต้นเพื่อให้สามารถใช้งานได้ นี่คือสิ่งที่ฉันทำ

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

และแทรกสิ่งนี้ลงในไฟล์:

<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>

ถัดไปคุณต้องเปิดใช้งาน / ปิดการใช้งานเว็บไซต์ที่เหมาะสม:

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

หวังว่าจะช่วยใครซักคน


ขอบคุณที่ร่วม @Louth ฉันมีความยาวตั้งแต่เลิกนี้และไม่มีเซิร์ฟเวอร์อีกต่อไป ยังทำให้ฉันรำคาญใจที่ฉันไม่เคยทำงานมาก่อนฉันอาจเริ่มเซิร์ฟเวอร์ใหม่เพื่อทดสอบอีกครั้ง ขอขอบคุณอีกครั้งฉันจะแน่ใจว่าได้อัปเดตถ้า / เมื่อฉันลองอีกครั้ง
agentcurry

The Jenkins wiki อธิบายวิธีเรียกใช้ Jenkins เบื้องหลัง Apache: wiki.jenkins-ci.org/display/JENKINS/…
mneute

6

พบสิ่งนี้ด้วยการลองผิดลองถูก หากการกำหนดค่าของคุณระบุชื่อเซิร์ฟเวอร์หมายถึงคำสั่ง VirtualHost ของคุณจะต้องทำเช่นเดียวกัน ในตัวอย่างต่อไปนี้ Awesome.example.com และ amazing.example.com ทั้งสองจะถูกส่งต่อไปยังบริการท้องถิ่นบางอย่างที่ทำงานบนพอร์ต 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>

ฉันรู้ว่านี่ไม่ได้ตอบคำถาม แต่ฉันวางไว้ที่นี่เพราะนี่คือผลการค้นหาอันดับต้น ๆ สำหรับการส่งต่อพอร์ต Apache ดังนั้นฉันคิดว่ามันจะช่วยให้ใครสักคนในวันหนึ่ง


นี่เป็นคนเดียวที่ทำงานให้ฉัน การใช้*:80แทนที่จะexample.com:80หมายความว่าพอร์ตจะไม่ถูกเปลี่ยนเส้นทาง
Seb123

4

คุณต้องแน่ใจว่าเปิดใช้งานพรอกซีบนเซิร์ฟเวอร์ คุณสามารถทำได้โดยใช้คำสั่งต่อไปนี้:

  a2enmod proxy
  a2enmod proxy_http

  service apache2 restart

3

นี่อาจเป็นคำถามเก่า แต่นี่คือสิ่งที่ฉันทำ:

ในไฟล์. conf โหลดโดย apache:

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

คำอธิบาย: รับฟังคำขอทั้งหมดไปยังพอร์ตของเครื่อง 80 หากฉันขอ " http://something.com/somethingorother" ให้ส่งต่อคำขอนั้นไปที่ " http://localhost:8080/somethingorother" สิ่งนี้ควรใช้ได้กับผู้เยี่ยมชมภายนอกเนื่องจากเอกสารจะจับคู่คำขอระยะไกลกับพื้นที่ของเซิร์ฟเวอร์ภายใน

ฉันใช้ Apache 2.4.6-2ubuntu2.2 ดังนั้นฉันไม่แน่ใจว่า "-2ubuntu2.2" มีผลต่อการบังคับใช้ที่กว้างขึ้นของคำตอบนี้อย่างไร

หลังจากคุณทำการเปลี่ยนแปลงเหล่านี้เพิ่มโมดูลที่จำเป็นและรีสตาร์ท apache

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

2

หากคุณไม่จำเป็นต้องใช้พร็อกซีที่ JBoss และ mydomain.com:8080 สามารถ "เปิดเผย" ต่อโลกได้ฉันก็จะทำเช่นนี้

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

การใช้พอร์ตอื่นที่ไม่ใช่ 80 ไม่เพียง แต่ดูน่าเกลียด แต่ยังสามารถทำให้เกิดปัญหากับพร็อกซีเซิร์ฟเวอร์หรือ ISP ในกรณีนี้ให้ลบ Apache และรัน JBoss บนพอร์ต 80 แทน!
Martin Vilcans

การทำงานทุกอย่างภายใต้ JBoss เป็นตัวเลือกฉันแค่พยายามหลีกเลี่ยงการย้ายไซต์ apache ไปยัง JBoss แต่ไม่ควรใช้เวลามากเกินไป ขอบคุณสำหรับความคิดเห็น.
agentcurry


1

อาปาเช่ของฉันฟัง 2 พอร์ตที่ต่างกัน

Listen 8080
Listen 80  

ฉันใช้ 80 เมื่อฉันต้องการ URL โปร่งใสและไม่ใส่พอร์ตหลังจาก URL มีประโยชน์สำหรับบริการของ Google ที่ไม่อนุญาตให้มี URL ในเครื่อง?

แต่ฉันใช้ 8080 สำหรับการพัฒนาภายในที่ฉันใช้พอร์ตเป็นข้อมูลอ้างอิงสำหรับ "สภาพแวดล้อม dev"


0

Apache รองรับโฮสต์เสมือนที่ใช้ชื่อและ IP ดูเหมือนว่าคุณกำลังใช้ทั้งคู่ซึ่งอาจไม่ใช่สิ่งที่คุณต้องการ

ฉันคิดว่าคุณกำลังพยายามตั้งค่าโฮสติ้งเสมือนจริงตามชื่อและเพื่อที่คุณไม่จำเป็นต้องระบุที่อยู่ IP

ลอง <VirtualHost *: 80> จะผูกกับที่อยู่ IP ทั้งหมดเว้นแต่คุณอยากIP ตาม virtual hosting อาจเป็นกรณีนี้หากเซิร์ฟเวอร์มีที่อยู่ IP หลายแห่งและคุณต้องการแสดงเว็บไซต์ที่แตกต่างกันในที่อยู่ที่แตกต่างกัน การตั้งค่าที่พบมากที่สุดคือ (ฉันจะเดา) โฮสต์เสมือนตามชื่อ


มันสมเหตุสมผลแล้วชื่อตามคือสิ่งที่ฉันต้องการ ฉันเปลี่ยนมัน แต่มันยังคงไม่ได้กำหนดเส้นทางไปยังพอร์ตอื่น
agentcurry

0

คุณต้องการ 2 สิ่ง:

  1. เพิ่มการServerAlias www.mydomain.comกำหนดค่าของคุณ
  2. เปลี่ยน proxypass ของคุณเป็นProxyPassMatch ^(.*)$ http://localhost:8080/example$1, เพื่อป้องกัน mod_dir และเครื่องหมายทับต่อท้ายจากการแทรกแซง

ฉันเพิ่ม ServerAlias ​​แต่ก็ยังไม่มีโชค
agentcurry

0

ทั้งหมดเป็นข้อมูลเชิงลึกที่ยอดเยี่ยมในการเข้าถึงพอร์ตผ่านชื่อโดเมนบนเซิร์ฟเวอร์เสมือน อย่างไรก็ตามอย่าลืมเปิดใช้งานเซิร์ฟเวอร์เสมือน นี่อาจถูกคอมเม้นท์:

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

เรารัน WSGI กับเซิร์ฟเวอร์ Apache ที่โดเมน sxxxx.com และเซิร์ฟเวอร์ golang ที่ทำงานบนพอร์ต 6800 ดูเหมือนว่าไฟร์วอลล์บางตัวจะบล็อกชื่อโดเมนด้วยพอร์ต นี่คือทางออกของเรา:

<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

นี่ทำงานใน ISPConfig ด้วย ในรายการเว็บไซต์จะได้รับภายในโดเมนคลิกที่แท็บตัวเลือกเพิ่มบรรทัดเหล่านี้:;

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

จากนั้นไปที่เว็บไซต์และ wolaa :) นี่คือโปรโตคอล HTTPS ที่ใช้งานได้เช่นกัน


0

ลองอันนี้-

<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> 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.