banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Forum Index Thảo luận hệ điều hành *nix Sử dụng nginx làm reverse proxy cho nhiều web server  XML
  [Question]   Sử dụng nginx làm reverse proxy cho nhiều web server 21/11/2011 08:44:14 (+0700) | #1 | 250163
shuichi_akai
Elite Member

[Minus]    0    [Plus]
Joined: 12/10/2003 10:40:06
Messages: 161
Location: /home
Offline
[Profile] [PM]
Mình đang có vài website chạy các chức năng khác nhau trong nội bộ với các domain khác nhau (một số chỉ chạy web và một số chứa static files các loại). Mục đích chính của việc đưa nginx ra làm reverse thì các bạn cũng rõ là nginx đáp ứng số req lớn và nhanh, ngoài ra quan trọng hơn là cache control cho static contents (.js, .jpg, .gif, v.v ...)

Mô hình của mình là

Code:
+---------+
                                        port 8001|         |
                                        +--------+ nginx 1 | a.com
                                        |        |         |
                                        |	 +---------+
                  +-----------------+   |p 8002  +---------+
            port80|    nginx  0     |---|--------| nginx 2 | b.com
INTERNET----------| (reverse proxy) |   |        +---------+
                  +-----------------+   |
                                        +--------+---------+
					port n	 | nginx n | n.com
						 +---------+


Cấu hình của mình như sau:
- Ở reverse proxy, dùng chỉ thị proxy_pass trong nginx để chuyển hướng đối với từng server phía sau.

Code:
server {
    listen       80;
    server_name  a.com;

    access_log  on;
    error_log on;
    # proxy to Apache 2 and mod_python
    location / {
        proxy_pass         http://10.0.0.1:8001;
        server_name_in_wwwect off;

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


Cấu hình trên server a.com

Code:
server {
        listen       8001;
        server_name  a.com;
        server_name_in_wwwect off;

        charset utf8;

        access_log  logs/host.access.log;

        location / {
            root   /www;
            index  index.html index.htm index.php;
        }


Sau đấy thì reverse proxy chuyển hướng chính xác tới từng web server phía sau nó, nhưng có vấn đề là nếu mở đường dẫn dạng http://a.com/folder/ thì bình thường còn nếu mở http://a.com/folder (không có dấu gạch ở cuối) thì sẽ bị báo lỗi không tìm thấy máy chủ vì browser được kết nối tới http://a.com:8001/folder

Như vậy vấn đề có thể là ở con reverse proxy, nhưng mình không hiểu tại sao nếu không có dấu gạch ở cuối thì người dùng lại bị chuyển sang a.com:8001 ??? Vì nếu browser tìm tới a.com:8001 thì sẽ không đi qua con reverse và bị từ chối.

Xin nhờ các bạn cho ý kiến để tìm lý do và khắc phục việc này.

Xin cảm ơn
[Up] [Print Copy]
  [Question]   Sử dụng nginx làm reverse proxy cho nhiều web server 21/11/2011 09:45:16 (+0700) | #2 | 250166
[Avatar]
vitcon01
Member

[Minus]    0    [Plus]
Joined: 29/04/2009 11:28:21
Messages: 306
Offline
[Profile] [PM]
2 năm trước anh cũng hỏi 1 vấn đề y như vậy, anh có thể xem lại bài viết này.
/hvaonline/posts/list/30410.html
JK - JH
()()()
LTKT - LTT
[Up] [Print Copy]
  [Question]   Sử dụng nginx làm reverse proxy cho nhiều web server 21/11/2011 09:54:16 (+0700) | #3 | 250167
shuichi_akai
Elite Member

[Minus]    0    [Plus]
Joined: 12/10/2003 10:40:06
Messages: 161
Location: /home
Offline
[Profile] [PM]
Không giống nhau đâu, nếu standalone nginx thì vấn đề 2 năm trước giải quyết xong rồi. Còn bây giờ thì khác.
[Up] [Print Copy]
  [Question]   Sử dụng nginx làm reverse proxy cho nhiều web server 21/11/2011 09:57:30 (+0700) | #4 | 250168
[Avatar]
vitcon01
Member

[Minus]    0    [Plus]
Joined: 29/04/2009 11:28:21
Messages: 306
Offline
[Profile] [PM]

shuichi_akai wrote:
Không giống nhau đâu, nếu standalone nginx thì vấn đề 2 năm trước giải quyết xong rồi. Còn bây giờ thì khác. 

--->em tìm theo link của anh quân thì thấy có bài này không biết có thể giúp được gì anh không.
http://forum.slicehost.com/comments.php?DiscussionID=3394
JK - JH
()()()
LTKT - LTT
[Up] [Print Copy]
  [Question]   Sử dụng nginx làm reverse proxy cho nhiều web server 21/11/2011 10:27:52 (+0700) | #5 | 250171
shuichi_akai
Elite Member

[Minus]    0    [Plus]
Joined: 12/10/2003 10:40:06
Messages: 161
Location: /home
Offline
[Profile] [PM]
Bình thường thì dùng server_name_in_wwwect off; là được, như trên file conf của mình có rồi đó, nhưng vẫn không tác dụng.
[Up] [Print Copy]
  [Question]   Sử dụng nginx làm reverse proxy cho nhiều web server 21/11/2011 12:07:36 (+0700) | #6 | 250173
[Avatar]
conmale
Administrator

Joined: 07/05/2004 23:43:15
Messages: 9353
Location: down under
Offline
[Profile] [PM]
Đối với web service (bất kỳ apache hay nginx),
- /folder --> file tên "folder"
- /folder/ --> folder tên "folder".

Hai cái hoàn toàn khác nhau. Nếu request /folder thì nginx sẽ nghĩ là client muốn truy cập một file có tên là "folder" và nếu không có file nào như vậy (trong trường hợp này thì chắc chắn không có) thì sẽ bị error 404.

Giải pháp cho trường hợp này là dùng rewrite, ví dụ:
rewrite ^([^.]*[^/])$ $1/ permanent;

Đại khái nó sẽ thêm cái "/" vào bất cứ request nào không có dấu chấm "." (ví dụ như /folder thì sẽ thành /folder/ nhưng index.php thì giữ nguyên). Đúng ra, nếu mình thiết kế trang web và thiết lập URL thì tuyệt đối không dùng /folder trong đường dẫn mà phải là /folder/ ngay từ đầu để không phải nhức đầu với những thứ như trên.
What bringing us together is stronger than what pulling us apart.
[Up] [Print Copy]
  [Question]   Sử dụng nginx làm reverse proxy cho nhiều web server 21/11/2011 12:39:31 (+0700) | #7 | 250175
shuichi_akai
Elite Member

[Minus]    0    [Plus]
Joined: 12/10/2003 10:40:06
Messages: 161
Location: /home
Offline
[Profile] [PM]
Vâng, em cũng có thử rewrite để thêm dấu / vào như anh chỉ, đường link được thêm dấu / vào như mong muốn nhưng nó vẫn là dạng http://a.com:8001/folder/ nên vẫn không truy cập được. Em chỉ thắc mắc ở cái vụ a.com:8001, không biết vì lý do gì mà browser lại bị chuyển sang đường dẫn đó.

Để tìm hiểu kỹ hơn, em bật wirechark lên xem thì nhừng đường dẫn dạng http://a.com/folder/ thì http SYN, ACK sau đó GET bình thường ví dụ

Code:
219	8.851357	10.0.0.178	10.0.0.1	TCP	54	43678 > http [ACK] Seq=9163 Ack=7165 Win=64732 Len=0
222	9.265226	10.0.0.178	10.0.0.1	HTTP	603	GET /home/ HTTP/1.1


Còn khi mở đường dẫn dạng http://a.com/folder thì:

Code:
324	12.780183	10.0.0.178	10.0.0.1	TCP	66	43681 > vcom-tunnel [SYN] Seq=0 Win=65535 Len=0 MSS=1460 WS=2 SACK_PERM=1
326	12.784051	10.0.0.1	10.0.0.178	TCP	60	vcom-tunnel > 43681 [RST, ACK] Seq=1 Ack=1 Win=0 Len=0


Như vậy là truy cập tới a.com/folder bị nhầm sang giao thức VCOM tunnel, em quên check well-known port mà cứ nghĩ là trong dãy port 8000 có thể sử dụng tuỳ ý.

Em đã đổi a.com listen sang port khác và có vẻ hoạt động bình thường rồi ạ.

[Up] [Print Copy]
  [Question]   Sử dụng nginx làm reverse proxy cho nhiều web server 21/11/2011 16:20:48 (+0700) | #8 | 250178
[Avatar]
quanta
Moderator

Joined: 28/07/2006 14:44:21
Messages: 7265
Location: $ locate `whoami`
Offline
[Profile] [PM]
10.0.0.1 là IP của server nào bạn? Sao reverse proxy cũng có server_name là a.com à?
Let's build on a great foundation!
[Up] [Print Copy]
  [Question]   Sử dụng nginx làm reverse proxy cho nhiều web server 21/11/2011 17:10:14 (+0700) | #9 | 250180
shuichi_akai
Elite Member

[Minus]    0    [Plus]
Joined: 12/10/2003 10:40:06
Messages: 161
Location: /home
Offline
[Profile] [PM]
10.0.0.1 là ip của a.com còn reverse proxy có ip khác và server_name khác so với a.com smilie
[Up] [Print Copy]
  [Question]   Sử dụng nginx làm reverse proxy cho nhiều web server 21/11/2011 17:13:38 (+0700) | #10 | 250182
[Avatar]
quanta
Moderator

Joined: 28/07/2006 14:44:21
Messages: 7265
Location: $ locate `whoami`
Offline
[Profile] [PM]
Mình thấy trong cấu hình của reverse proxy bạn để server_name là a.com?
Let's build on a great foundation!
[Up] [Print Copy]
  [Question]   Sử dụng nginx làm reverse proxy cho nhiều web server 21/11/2011 17:19:10 (+0700) | #11 | 250186
shuichi_akai
Elite Member

[Minus]    0    [Plus]
Joined: 12/10/2003 10:40:06
Messages: 161
Location: /home
Offline
[Profile] [PM]
Trong reverse proxy mình cấu hình nhiều server với server_name khác nhau trong đó có proxy_pass tới từng máy tương ứng, mình copy một cấu hình thể hiện cho a.com mà thôi.
[Up] [Print Copy]
  [Question]   Sử dụng nginx làm reverse proxy cho nhiều web server 22/11/2011 17:00:46 (+0700) | #12 | 250214
Dpm
Member

[Minus]    0    [Plus]
Joined: 06/04/2009 01:43:30
Messages: 85
Offline
[Profile] [PM]
Bạn thử đẩy cái
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
lên phía server hoặc http xem.
[Up] [Print Copy]
  [Question]   Sử dụng nginx làm reverse proxy cho nhiều web server 22/11/2011 17:09:47 (+0700) | #13 | 250215
shuichi_akai
Elite Member

[Minus]    0    [Plus]
Joined: 12/10/2003 10:40:06
Messages: 161
Location: /home
Offline
[Profile] [PM]

Dpm wrote:
Bạn thử đẩy cái
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
lên phía server hoặc http xem. 


3 dòng đó chỉ tác dụng để logging thôi bạn ạ.
[Up] [Print Copy]
  [Question]   Sử dụng nginx làm reverse proxy cho nhiều web server 22/11/2011 17:56:41 (+0700) | #14 | 250217
Dpm
Member

[Minus]    0    [Plus]
Joined: 06/04/2009 01:43:30
Messages: 85
Offline
[Profile] [PM]
Sao lại có tác dụng logging?bạn nói rõ xem nó có liên quan gì đến logging?cái proxy_set_header cũng chỉ để logging thôi sao?
[Up] [Print Copy]
  [Question]   Sử dụng nginx làm reverse proxy cho nhiều web server 23/11/2011 10:17:19 (+0700) | #15 | 250231
vd_
Member

[Minus]    0    [Plus]
Joined: 06/03/2010 03:05:09
Messages: 124
Offline
[Profile] [PM]
@shuichi_akai
X-Real-IP và X-Forwarded-For thì dùng log được, nhưng cái Host sẽ rất quan trọng để reverse proxy cho đúng. Bạn kiểm tra thêm các response từ server về client sẽ thấy tác dụng của Host. Bạn xem thêm http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html phần 14.23 có đề cập vai trò của field Host.
[Up] [Print Copy]
  [Question]   Sử dụng nginx làm reverse proxy cho nhiều web server 24/11/2011 15:28:52 (+0700) | #16 | 250279
shuichi_akai
Elite Member

[Minus]    0    [Plus]
Joined: 12/10/2003 10:40:06
Messages: 161
Location: /home
Offline
[Profile] [PM]
Nghĩa là nginx (ở đây là reverse proxy) sẽ chèn thêm vào header giá trị $host tương ứng với server_name đã khai báo.
[Up] [Print Copy]
[digg] [delicious] [google] [yahoo] [technorati] [reddit] [stumbleupon]
Go to: 
 Users currently in here 
1 Anonymous

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|