2010-06-01 10 views
9

chúng tôi đang tìm cách trỏ Apache DocumentRoot của chúng tôi đến một liên kết tượng trưng. Ví dụ: DocumentRoot/var/www/html/finalbuildĐặt tài liệu apacheRoot to symlink (để triển khai dễ dàng)

finalbuild phải trỏ đến một thư mục ở đâu đó như/home/user/build3

khi chúng tôi di chuyển một xây dựng mới để/home/user/build4 chúng tôi muốn sử dụng một vỏ script thay đổi liên kết tượng trưng "finalebuild" thành thư mục mới/home/user/build4 và thực hiện khởi động lại apache duyên dáng để có phiên bản ứng dụng web mới và chạy với ít rủi ro.

Cách tốt nhất để tạo liên kết tượng trưng này và thay đổi liên kết này sau đó bằng cách sử dụng tập lệnh shell là gì?

+1

I suy nghĩ "rm/var/www/html/finalbuild & & ln -s/home/người dùng/build4/var/www/html/finalbuild". Bạn thậm chí có thể không cần phải khởi động lại Apache. – barrycarter

+0

cảm ơn, tôi đã thay đổi docroot và chỉ nó vào một liên kết tượng trưng, ​​nhưng apache dường như không được lắng nghe ... Tôi đã khởi động lại apache thành công, bất kỳ ý tưởng? – Jorre

+0

Tôi cũng đã cố gắng tìm một câu trả lời cho điều này. Apache chỉ cho tôi một lỗi 403. Không may mắn cho đến nay. Có lẽ bởi vì đó là thực tế xấu để làm điều này trong sản xuất. Chỉ muốn làm điều đó trên hộp dev của tôi mặc dù. – nedned

Trả lời

3

Tôi đã sử dụng các liên kết tượng trưng như tài liệu apache DocumentRoot trong quá trình sản xuất mà không cần khởi động lại một cách hiệu quả. Nói chung, ý tưởng sẽ hoạt động. Lỗi 403 có thể cho biết lỗi quyền không liên quan đến thay đổi liên kết tượng trưng. Một nếp nhăn bổ sung mà bạn muốn thêm là making the symlink switch atomic để liên kết tượng trưng luôn tồn tại. Đó là để nói, không có lúc nào là liên kết tượng trưng không tồn tại, ngay cả trong một khoảnh khắc.

Giải pháp cho vấn đề này là thực hiện thay đổi bằng cách tạo liên kết tượng trưng mới và sau đó đổi tên nó thành liên kết tượng trưng cũ. Trên các hệ thống giống Unix, đổi tên là một hoạt động nguyên tử, và do đó, liên kết “thay đổi” sẽ là nguyên tử. Bằng tay, quá trình này trông như thế này:

$ ln -s new current_tmp && mv -Tf current_tmp current 
+1

Chỉ để mâu thuẫn với bản thân mình, tôi thấy liên kết này gặp sự cố: http://www.mikebrittain.com/blog/2009/05/12/case-against-using-symlinks-for-code-promotion/ – defmikekoh

7

Chúng tôi đang sử dụng capistrano để sử dụng một thiết lập tương tự. Tuy nhiên, chúng tôi đã gặp phải một số sự cố:

Sau khi chuyển sang thiết lập, mọi thứ có vẻ ổn nhưng sau đó chúng tôi bắt đầu nhận thấy rằng sau khi chạy cap deploy, mặc dù liên kết tượng trưng đã được thay đổi để trỏ về phía đầu sửa đổi, trình duyệt sẽ vẫn hiển thị các trang cũ, ngay cả sau khi làm mới nhiều và chắp thêm các tham số GET khác nhau.

Lúc đầu, chúng tôi nghĩ rằng đó là bộ nhớ đệm của trình duyệt, vì vậy để phát triển, chúng tôi đã vô hiệu hóa bộ nhớ đệm trình duyệt qua tiêu đề HTTP, nhưng điều này không thay đổi bất cứ điều gì. Sau đó, tôi đã kiểm tra để đảm bảo rằng chúng tôi đã không thực hiện toàn bộ bộ nhớ cache phía máy chủ và chúng tôi đã không làm như vậy. Nhưng sau đó tôi nhận thấy rằng nếu tôi xóa một tệp trong bản sửa đổi mà liên kết tượng trưng được sử dụng để trỏ tới, chúng tôi sẽ nhận được 404, vì vậy Apache đang phục vụ các trang mới, nhưng vẫn đang theo "liên kết tượng trưng cũ" và phân phát các trang từ thư mục sai.

Đây là lưu trữ được chia sẻ, vì vậy tôi không thể khởi động lại Apache. Vì vậy, tôi đã thử xóa liên kết tượng trưng và tạo một liên kết mới mỗi lần. Điều này dường như hoạt động đôi khi, nhưng không đáng tin cậy. Nó làm việc có lẽ 25 ~ 50% thời gian.

Cuối cùng, tôi thấy rằng nếu tôi:

  1. loại bỏ các liên kết tượng trưng hiện có (xóa nó hoặc đổi tên nó);
  2. đã yêu cầu trang, gây Apache để cố gắng giải quyết các liên kết tượng trưng nhưng thấy nó thiếu (kết quả là 404)
  3. sau đó tạo ra một liên kết tượng trưng mới vào thư mục mới

nó sẽ gây ra docroot để được cập nhật chính xác phần lớn thời gian.Tuy nhiên, ngay cả điều này không hoàn hảo và khoảng 2-5% thời gian, khi tập lệnh triển khai chạy wget để tìm nạp trang ngay sau khi đổi tên liên kết tượng trưng cũ, nó sẽ trả lại trang cũ thay vì 404.

Dường như Apache đang lưu vào bộ đệm hệ thống tập tin, hoặc có lẽ lệnh mv chỉ thay đổi hệ thống tập tin trong bộ nhớ trong khi Apache đang đọc từ hệ thống tập tin trên đĩa (thực sự không có ý nghĩa gì). Trong cả hai trường hợp, tôi đã đưa ra đề nghị của một ai đó để chạy sync sau khi thay đổi liên kết tượng trưng, ​​điều này sẽ khiến hệ thống tệp trên đĩa đồng bộ với bộ nhớ và có lẽ sự chậm trễ nhỏ cũng sẽ giúp wget trả lại 404.

+2

Nếu có ai hiểu lý do đằng sau hành vi này Nó sẽ là tuyệt vời để ghi lại nó. – ThorSummoner