Máy chủ web nginx giúp tăng tốc cho Drupal

Hiện nay Apache là máy chủ web được dùng phổ biến nhất trên thế giới do tính đa dụng. Nhưng cũng vì hỗ trợ nhiều tính năng nên phần mềm này trở nên nặng nề và không thích hợp để chạy các Sử dụng nginx để tăng tốc cho Drupalứng dụng đơn giản cần tốc độ cao. Bài viết sẽ hướng dẫn cài đặt nginx như là một bổ sung cho Apache.

Thông thường Apache được cài đặt để nghe trên cổng 80 để đáp ứng các truy vấn http (và có thể nghe trên cổng 443 với https). Mỗi khi khách truy cập, sẽ có hàng chục, thậm chí hàng trăm truy vấn được gửi đến. Ngoài truy vấn chính, còn có rất nhiều truy vấn phụ để tải các hình ảnh, định dạng, mã lệnh... để hiển thị trên trình duyệt.

Việc dùng Apache để đáp ứng mọi truy vấn này không khác gì “dùng dao mổ trâu để giết gà”. Để giải quyết vấn đề này, cách phổ biến nhất là chạy một máy chủ web nhẹ cân như nginx, lighttpd ở một tên miền khác, còn Apache chạy ở tên miền chính, chỉ nhận các truy vấn chính. Chẳng hạn như YouTube sử dụng Apache ở máy chủ chính, lighttpd để đáp ứng javascript/css, và hai loại máy chủ riêng khác cho ảnh thumbnail và cho video.

Tuy nhiên, không thể chạy cùng lúc hai máy chủ web trên cùng một địa chỉ IP và cùng cổng 80. Trong trường hợp này, giải pháp thường được sử dụng là proxy nghịch. Proxy này sẽ chuyển các truy vấn khác nhau đến các máy chủ khác nhau nằm ở “hậu trường” trên các cổng khác nhau.

Các máy chủ web như Apache, nginx đều có khả năng làm proxy nghịch. Trong cấu hình này, chúng ta dùng nginx để phục vụ các yêu cầu thông thường, và chuyển các yêu cầu cần đến PHP sang Apache nghe trên cổng 81.

Đầu tiên, chúng ta cấu hình nginx trên cổng 80 và các tên miền www.example.com (chuyển các yêu cầu đến Apache) lẫn static.example.com (yêu cầu đến nội dung tĩnh). Trên tên miền static.example.com nếu không tìm thấy nội dung sẽ chuyển ngược về www.example.com (dùng cho Imagecache).

server {
    listen 80;
    server_name www.example.com;

    location / {
        proxy_pass http://127.0.0.1:81;
    }
}
server {
    listen 80;
    server_name static.example.com;
    root /home/example/public_html;
    expires 30d;

    location / {
        try_files $uri @redirect;
    }

    location @redirect {
        rewrite ^(.*)$ http://www.example.com$1;
    }
}

Tiếp đến, cấu hình cho Apache nghe trên cổng 81, và chỉ nghe trên giao diện 127.0.0.1 vì không muốn xử lí các truy vấn từ ngoài. Chúng ta muốn mọi truy vấn cần gián tiếp thông qua cổng 80.

Listen 127.0.0.1:81
<VirtualHost 127.0.0.1:81>
    ServerName www.example.com
    DocumentRoot /home/example/public_html
</VirtualHost>

Chúng ta cùng xem một số kết quả sau khi thay đổi. Cấu hình của Apache vẫn không đổi, dùng MPM Prefork, mod_fcgid, chỉ có thay đổi về IP và cổng. Cùng lúc chuyển sang nginx, nhóm phát triển có tối ưu MySQL nên không phải tất cả mọi thay đổi đều do nginx.

Trước đây tải rất bất ổn, sau đó thì trở nên ổn định ở mức rất thấp, chỉ bằng 10% đến 20% lúc trước.

CPU xử lí ít hơn, đồng thời hiệu suất đĩa tốt hơn (tỉ lệ iowait rất thấp)

Truy xuất đĩa được tối ưu.

Không có nhiều thay đổi về bộ nhớ sử dụng. Nhưng nginx ổn định hơn, không phụ thuộc vào lượng khách truy cập.

Truy xuất mạng nhiều hơn do dùng proxy. Nhưng không ảnh hưởng đến hiệu năng.

Bởi vì tải thấp hơn nên truy vấn PHP thực hiện nhanh hơn, do đó số lượng trung bình tại một thời điểm có giảm nhẹ. Cũng không có hiện tượng đôi khi quá tải như trước kia.

nginx dùng luồng thay cho tiến trình. Số tiến trình giữ giá trị ổn định.

Trên đây là cách cấu hình máy chủ, một trong những thao tác để tối ưu ứng dụng web. Chúc các bạn tăng tốc cho Drupal của mình!

SSH Keys

SSH keys allow authentication between two hosts without the need of a password. SSH key authentication uses two keys a private key and a public key.

To generate the keys, from a terminal prompt enter:

ssh-keygen -t dsa

This will generate the keys using a DSA authentication identity of the user. During the process you will be prompted for a password. Simply hit Enter when prompted to create the key.

By default the public key is saved in the file ~/.ssh/id_dsa.pub, while ~/.ssh/id_dsa is the private key. Now copy the id_dsa.pub file to the remote host and append it to ~/.ssh/authorized_keys by entering:

ssh-copy-id username@remotehost

Finally, double check the permissions on the authorized_keys file, only the authenticated user should have read and write permissions. If the permissions are not correct change them by:

chmod 600 .ssh/authorized_keys

You should now be able to SSH to the host without being prompted for a password.