Cách chuyển từ web server Apache sang Nginx trên VPS Ubuntu
Có một số lựa chọn bạn phải thực hiện khi cài đặt và chạy một trang web hoặc ứng dụng. Đôi khi, yêu cầu của bạn thay đổi, công nghệ mới trở nên khả thi hoặc bong bóng cơ sở user của bạn một cách bất ngờ. Dù lý do của bạn là gì, một trong những thành phần của ứng dụng mà bạn có thể cân nhắc thay đổi là web server .Mặc dù web server Apache hiện là web server phổ biến nhất trên thế giới, nhưng Nginx đang phát triển với tốc độ nhanh chóng. Điều này không có gì đáng ngạc nhiên vì Nginx hoạt động xuất sắc trong khi sử dụng ít tài nguyên. Đối với nhiều trang web, việc di chuyển sang Nginx sẽ cải thiện hiệu suất.
Trong hướng dẫn này, ta sẽ thảo luận về cách di chuyển một trang web từ Apache sang Nginx trên VPS Ubuntu 12.04. Ta sẽ cố gắng duy trì tính chung chung trong các đề xuất của bạn , nhưng sẽ cung cấp cho bạn gợi ý về một số lĩnh vực mà bạn có thể cần điều chỉnh cho mục đích của riêng mình.
Hướng dẫn này giả định bạn đã cài đặt một LAMP (Linux, Apache, MySQL và PHP) bằng cách sử dụng hướng dẫn này . Nếu bạn chỉ chọn hình ảnh LAMP bằng một cú nhấp chuột khi tạo server của bạn , server của bạn cũng sẽ có cấu hình này.
Cài đặt Nginx
Điều đầu tiên mà ta sẽ làm để bắt đầu di chuyển các trang web của bạn là cài đặt phần mềm server mới của ta . Điều này sẽ cho phép ta cấu hình server mới của bạn bằng cách xem các file cấu hình Apache hiện tại của ta để được hướng dẫn.
May mắn là Nginx có mặt trong repository lưu trữ Ubuntu theo mặc định. Hãy cài đặt nó ngay bây giờ:
sudo apt-get update sudo apt-get install nginx
Một chi tiết triển khai trở nên rất quan trọng trong trường hợp sử dụng của ta là Nginx giảm tải mọi xử lý động cho một quy trình riêng biệt. Điều này cho phép Nginx duy trì tốc độ và nhanh chóng. Nó có thể tập trung vào chức năng cốt lõi của nó mà không cần phải cố gắng thêm hỗ trợ PHP thông qua các module . Thay vào đó, nó chỉ download một ứng dụng được tạo cho mục đích đó.
Điều này đang được đề cập tại thời điểm này để nói rằng ta cũng cần cài đặt một trình PHP processor để xử lý các tập lệnh PHP. Lựa chọn tiêu chuẩn là php5-fpm
, hoạt động tốt với Nginx:
sudo apt-get install php5-fpm
Bạn sẽ có tất cả phần mềm cần thiết để thay đổi trang web của bạn sang Nginx. Ta vẫn cần cấu hình phần mềm của bạn để mô phỏng cấu hình Apache đang chạy.
Cài đặt cấu hình thử nghiệm Nginx
Vì ta hiện đang chạy Apache, nếu ta có thể tránh được, ta muốn cấu hình server Nginx của bạn độc lập với Apache để trang web của ta vẫn hoạt động trong quá trình chuyển đổi.
Điều này cũng đơn giản như thử nghiệm Nginx trên một cổng thay thế cho đến khi ta sẵn sàng củng cố các thay đổi của bạn . Bằng cách này, ta có thể chạy hai server đồng thời.
Bắt đầu bằng cách mở file cấu hình cho trang Nginx mặc định:
sudo nano /etc/nginx/sites-available/default
Trong phần server {
, hãy thêm chỉ thị lắng nghe để yêu cầu Nginx lắng nghe trên một cổng khác với cổng 80 (Apache vẫn đang sử dụng để phục vụ các yêu cầu). Đối với hướng dẫn của ta , ta sẽ sử dụng cổng 8000.
<pre>
người phục vụ {
<span class="highlight">listen 8000;</span> . . . . . .
</pre>
Lưu và đóng file . Đây là thời điểm tốt để kiểm tra tại chỗ để xem ta có thể truy cập server Nginx của bạn hay không. Khởi động Nginx để kiểm tra điều này:
sudo service nginx start
Sử dụng số cổng mà ta đã cấu hình để truy cập cấu hình Nginx mặc định. Nhập cái này vào trình duyệt của bạn:
<pre>
http: // <span class = “highlight”> ip hoặc_domain của bạn </span>: 8000
</pre>
Phiên bản Apache của bạn vẫn đang chạy trên cổng mặc định 80. Bạn cũng có thể kiểm tra bằng cách truy cập trang web của bạn mà không có :8000
ở cuối (ví dụ của ta chỉ cung cấp trang Apache mặc định. Nếu bạn đã cấu hình trang web của bạn , điều đó sẽ thay vào đó ở đây):
<pre>
http: // <span class = “highlight”> ip hoặc_domain của bạn </span>
</pre>
Dịch cấu hình Apache của bạn
Đến đây bạn đã cài đặt và chạy cả hai server , bạn có thể bắt đầu di chuyển và dịch cấu hình Apache của bạn để sử dụng với Nginx. Điều này phải được thực hiện thủ công, vì vậy điều quan trọng là bạn phải hiểu cách Nginx được cấu hình.
Nhiệm vụ này chủ yếu là viết các khối server Nginx, tương tự như các server ảo Apache. Apache giữ các file này trong /etc/apache2/sites-available/
và Nginx tuân theo và giữ các khai báo khối server của nó trong /etc/nginx/sites-available/
trên Ubuntu.
Đối với mỗi khai báo server ảo, bạn sẽ tạo một khối server . Nếu bạn xem qua các file Apache của bạn , bạn có thể sẽ tìm thấy các server ảo trông giống như sau:
<pre>
<VirtualHost *: 80>
Administrator web ServerAdmin @ <span class = “highlight”> your site.com </span>
ServerName <span class = “highlight”> your site.com </span>
ServerAlias www . <Span class = “highlight”> your_site.com </span>
DocumentRoot /var/www <Directory /> Options FollowSymLinks AllowOverride None </Directory> <Directory /var/www/> Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny allow from all </Directory> ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ <Directory "/usr/lib/cgi-bin"> AllowOverride None Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch Order allow,deny Allow from all </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log LogLevel warn CustomLog ${APACHE_LOG_DIR}/access.log combined Alias /doc/ "/usr/share/doc/" <Directory "/usr/share/doc/"> Options Indexes MultiViews FollowSymLinks AllowOverride None Order deny,allow Deny from all Allow from 127.0.0.0/255.0.0.0 ::1/128 </Directory>
</VirtualHost>
</pre>
Ta có thể bắt đầu xây dựng khối server Nginx của bạn bằng cách sử dụng cấu hình này.
Trong folder /etc/nginx/sites-available/
, hãy mở file mà ta đã chỉnh sửa trước đó để khai báo cổng Nginx:
sudo nano /etc/nginx/sites-available/default
Bỏ qua các dòng comment vào lúc này, nó sẽ trông giống như sau:
<pre>
người phục vụ {
nghe 8000;
root /usr/share/nginx/www; index index.html index.htm; server_name localhost; location / { try_files $uri $uri/ /index.html; } location /doc/ { alias /usr/share/doc/; autoindex on; allow 127.0.0.1; deny all; }
}
</pre>
Bạn đã bắt đầu thấy một số mục có vẻ tương ứng với cấu hình Apache của ta . Nói chung, các chỉ thị chính dịch như thế này:
<pre>
Apache Nginx
<VirtualHost *: 80> server {
nghe 80;
ServerName yourite.com
ServerAlias www.yoursite.com server_name yourite.com www.yoursite.com ;
DocumentRoot / path / to / root root / path / to / root;
AllowOverride Tất cả <span class = “highlight”> (Không có sẵn giải pháp thay thế) </span>
DirectoryIndex index.php index.php index.php;
ErrorLog / path / to / log error_log / path / to / log error;
CustomLog / path / to / log kết hợp access_log / path / to / log main;
Bí danh / url / “/ path / to / files” location / url / {
<Thư mục “/ path / to / files”> alias / path / to / files;
</pre>
Nếu ta định tạo một khối server mô phỏng chức năng của file server ảo từ phía trên, nó có thể trông giống như sau:
<pre>
người phục vụ {
nghe 8000; # Ta cố tình để nguyên trạng này để tránh xung đột vào lúc này
root /var/www; server_name <span class="highlight">your_site.com</span> www.<span class="highlight">your_site.com</span>; location / { try_files $uri $uri/ /index.html; } location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; } location /doc/ { alias /usr/share/doc/; autoindex on; allow 127.0.0.1; deny all; } location ~/\.ht { deny all; }
}
</pre>
Ta đã loại bỏ một số mục và cũng thêm một vài dòng bổ sung mà ta nên giải thích.
Thứ nhất, các dòng log lỗi đã bị loại bỏ khỏi cấu hình. Điều này là do chúng đã được xác định trong file /etc/nginx/nginx.conf
. Điều này cung cấp cho ta một mặc định mà ta sẽ sử dụng.
Ta cũng đã loại bỏ chỉ thị ServerAdmin
vì Nginx không nhúng thông tin đó vào các trang lỗi của nó.
Việc PHP processor cũng đã thay đổi một chút. Do PHP được xử lý riêng biệt trong Nginx, ta chuyển các file này sang chương trình php-fpm
mà ta đã cài đặt trước đó. Điều này được thực hiện thông qua một socket (mà ta cần phải cấu hình trong giây lát).
Phần tài liệu được thay đổi để phản ánh tài liệu Nginx. Mặt khác, nó hoạt động khá giống nhau.
Cuối cùng, ta cấu hình Nginx để từ chối quyền truy cập vào bất kỳ .htaccess
hoặc các file khác bắt đầu bằng .ht
trong folder của ta . Đây là các file cấu hình dành riêng cho Apache và chúng không hoạt động với Nginx. Sẽ an toàn hơn nếu không để lộ các file cấu hình này.
Lưu file khi bạn hoàn tất.
Ta phải khởi động lại server Nginx của bạn để những thay đổi này được công nhận:
sudo service nginx restart
Cấu hình PHP-FPM
Bây giờ ta đã có hầu hết cấu hình Nginx, ta cần sửa đổi cấu hình php-fpm để giao tiếp bằng các kênh mà ta đã chỉ định.
Để bắt đầu, ta nên sửa đổi file php.ini để nó không phân phát file một cách không an toàn.
sudo nano /etc/php5/fpm/php.ini
Dòng mà ta cần sửa đổi sẽ yêu cầu PHP cung cấp file chính xác được yêu cầu thay vì đoán nếu có kết quả khớp không hoàn chỉnh. Điều này ngăn không cho PHP có thể cung cấp hoặc tiết lộ dữ liệu nhạy cảm cho một người nào đó đang thăm dò các điểm yếu của trình PHP processor .
Tìm dòng chỉ định chỉ thị cgi.fix_pathinfo
và sửa đổi nó để nó giống như sau:
cgi.fix_pathinfo=0
Lưu và thoát khỏi file này.
Tiếp theo, ta sẽ thay đổi cách mà php-fpm kết nối với server của ta . Mở file này trong editor :
sudo nano /etc/php5/fpm/pool.d/www.conf
Tìm và sửa đổi chỉ thị listen
để phù hợp với giá trị mà ta đặt trong file cấu hình khối server :
listen = /var/run/php5-fpm.sock
Nếu bạn gặp phải vấn đề với việc xử lý nhiều yêu cầu PHP, bạn có thể cần quay lại đây và tăng số lượng quy trình con có thể được tạo ra cùng một lúc. Dòng bạn muốn thay đổi là:
<pre>
pm.max children = <span class = “highlight”> Số_children </span>
</pre>
Lưu file này.
Bây giờ, chương trình php-fpm của ta sẽ được cấu hình chính xác. Ta cần khởi động lại nó để các thay đổi của ta có hiệu lực.
sudo service php5-fpm restart
Khởi động lại Nginx cũng không ảnh hưởng gì:
sudo service nginx restart
Kiểm tra xem các file PHP nào bạn có trong folder root của bạn hoạt động chính xác. Bạn có thể nhận được các file PHP để thực thi giống như chúng trong Apache.
Nếu ta truy cập file info.php
mà ta đã tạo trong hướng dẫn Ubuntu LAMP, nó sẽ hiển thị như sau:
<pre>
http: // <span class = “highlight”> ip hoặc_domain của bạn </span>: 8000 / info.php
</pre>
Trong phần Biến PHP , bạn sẽ thấy Nginx được liệt kê là biến “SERVER_SOFTWARE”:
Chuyển trực tiếp trang web Nginx của bạn
Sau khi thực hiện thử nghiệm rộng rãi , bạn có thể cố gắng chuyển đổi liền mạch trang web của bạn từ Apache sang Nginx.
Điều này có thể xảy ra do cả hai server này đều không áp dụng các thay đổi cho đến khi chúng được khởi động lại. Điều này cho phép ta cài đặt mọi thứ và sau đó bật lựa chọn ngay lập tức.
Thực sự, điều duy nhất ta cần làm là sửa đổi cổng trong khối server Nginx. Mở file ngay bây giờ:
sudo nano /etc/nginx/sites-available/default
Thay đổi cổng trở lại cổng mặc định 80. Điều này sẽ cho phép nó bắt đầu chấp nhận truy cập HTTP thông thường ngay sau khi nó được khởi động lại.
<pre>
người phục vụ {
# nghe 8000;
nghe 80;
…
</pre>
Lưu và đóng file .
Nếu bạn chỉ đang chuyển một số trang web của bạn sang Nginx và tiếp tục cung cấp một số nội dung từ Apache, bạn cần phải tắt server ảo Apache phục vụ các yêu cầu trên cổng 80. Điều này là cần thiết để tránh xung đột. Nếu điều này không được thực hiện đúng, Nginx sẽ không khởi động được vì cổng đã được sử dụng.
Nếu bạn dự định tiếp tục chạy Apache, hãy kiểm tra các file và vị trí sau để biết việc sử dụng cổng 80:
/etc/apache2/ports.conf /etc/apache2/apache2.conf /etc/apache2/httpd.conf /etc/apache2/sites-enabled/ ## Search all sites in this directory
Sau khi thấy ổn rằng bạn đã thay đổi tất cả các cổng cần thiết, bạn có thể khởi động lại cả hai dịch vụ như sau:
sudo service apache2 reload && sudo service nginx reload
Apache sẽ reload , giải phóng cổng 80. Ngay sau đó, Nginx sẽ reload và bắt đầu chấp nhận các kết nối trên cổng đó. Nếu tất cả đều suôn sẻ, trang web bây giờ sẽ được cung cấp bởi Nginx.
Nếu bạn không sử dụng Apache nữa để phục vụ bất kỳ phần nào trên trang web của bạn , bạn có thể dừng hoàn toàn quy trình web của nó:
sudo service apache2 stop && sudo service nginx reload
Nếu bạn không sử dụng Apache nữa, bạn có thể gỡ cài đặt các file Apache tại thời điểm này. Bạn có thể dễ dàng tìm thấy các file liên quan đến Apache bằng lệnh :
dpkg --get-selections | grep apache
apache2 install apache2-mpm-prefork install apache2-utils install apache2.2-bin install apache2.2-common install libapache2-mod-auth-mysql install libapache2-mod-php5 install
Sau đó, bạn có thể gỡ cài đặt chúng bằng apt-get. Ví dụ:
sudo apt-get remove apache2 apache2-mpm-prefork apache2-utils apache2.2-bin apache2.2-common libapache2-mod-auth-mysql libapache2-mod-php5
Bạn cũng có thể xóa tất cả các gói phụ thuộc không còn cần thiết nữa:
sudo apt-get autoremove
Các biến chứng di cư
Có một số điều phổ biến trong thế giới Apache có thể khiến bạn nhầm lẫn khi cố gắng chuyển sang Nginx.
Viết lại bản dịch và file .htaccess
Một trong những điểm khác biệt cơ bản nhất là Nginx không tôn trọng việc overrides folder .
Apache sử dụng .htaccess
, cùng với chỉ thị AllowOverride All
trong một khối vị trí. Điều này cho phép bạn đặt các cấu hình theo folder cụ thể trong folder chứa các file .
Nginx không cho phép các file này. Việc chứa cấu hình với các file đang được cung cấp có khả năng là một vấn đề bảo mật nếu bị cấu hình sai và có thể dễ dàng xem các file cấu hình tập trung và không nhận ra rằng một cài đặt đang được overrides thông qua file .htaccess.
Do đó, tất cả cấu hình bạn đã liệt kê trong file .htaccess đang hoạt động phải được đặt trong khối vị trí trong cấu hình khối server cho server đó. Điều này thường không phức tạp hơn, nhưng bạn phải dịch các luật này giống như bạn đã làm với các định nghĩa server ảo.
Một điểm chung cần lưu ý trong các file .htaccess là các luật dành cho module mod_rewrite của Apache, điều này sẽ thay đổi các URL truy cập của nội dung để thân thiện hơn với user . Nginx có một module viết lại tương tự, nhưng sử dụng cú pháp khác. Thật không may, việc viết lại URL trong Nginx nằm ngoài phạm vi của hướng dẫn này.
Mô-đun và các biến chứng cấu hình bên ngoài
Một điều nữa cần lưu ý là bạn cần phải biết chức năng mà các module Apache mà bạn đã bật đang cung cấp.
Một ví dụ đơn giản là module dir
. Khi được bật, bạn có thể chỉ định thứ tự của các file mà Apache sẽ cố gắng phục vụ như một index folder bằng cách đặt một dòng như thế này trong file server ảo của bạn:
DirectoryIndex index.html index.htm
Dòng này sẽ xác định việc xử lý sẽ xảy ra cho server ảo này. Tuy nhiên, nếu dòng này không xuất hiện và module dir
được bật, thứ tự các file đang được cung cấp sẽ được xác định bởi file này:
sudo nano /etc/apache2/mods-enabled/dir.conf
<IfModule mod_dir.c> DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm </IfModule>
Điểm mấu chốt của vấn đề này là bạn phải nhận thức được khả năng một module , hoặc một cấu hình có nguồn root bên ngoài thuộc bất kỳ loại nào, vì vấn đề đó, có thể đang thực hiện một điều gì đó mức thấp mà bạn sẽ phải làm rõ ràng. Nginx.
Trong ví dụ này, bạn có thể chỉ định thứ tự index folder trong Nginx bằng cách thêm nó vào khối server :
server { . . . index index.php index.html index.htm; . . .
Điều quan trọng là phải nhớ điều này .
Một điều có thể hữu ích nếu bạn đang chuyển đổi một cấu hình trang web phức tạp là copy paste tất cả các file cấu hình có nguồn root riêng biệt vào một file nguyên khối và xem qua và dịch từng dòng một cách có hệ thống.
Điều này có thể khiến bạn đau đầu, nhưng đối với một server production , nó có thể giúp bạn tiết kiệm rất nhiều thời gian để theo dõi những gì đang gây ra hành vi lạ mà bạn không thể xác định được.
Kết luận
Sự phức tạp của việc chuyển đổi từ Apache sang Nginx gần như hoàn toàn phụ thuộc vào độ phức tạp của các cấu hình cụ thể của bạn. Nginx có thể xử lý khá nhiều thứ mà Apache có thể, với lợi ích của việc làm như vậy với ít tài nguyên hơn. Điều này nghĩa là trang web có thể phục vụ một cách trơn tru group user lớn hơn.
Mặc dù việc di chuyển không có ý nghĩa đối với tất cả các trang web và trong khi Apache là một server tuyệt vời phục vụ đầy đủ nhu cầu của nhiều dự án, bạn có thể thấy hiệu suất tăng hoặc khả năng mở rộng với Nginx. Nếu bạn vẫn yêu cầu Apache, một giải pháp thay thế khác là sử dụng Nginx làm Reverse Proxy cho server Apache của bạn . Cách tiếp cận này có thể tận dụng điểm mạnh của cả hai server một cách mạnh mẽ.
<div class = “author”> Bởi Justin Ellingwood </div>
Các tin liên quan
Cách cài đặt Apache mod_spdy trên VPS Debian 72013-12-12
Cách thiết lập ứng dụng Rails 4 với Apache và Passenger trên CentOS 6
2013-12-06
Cách thiết lập công cụ Railo CFML với Tomcat và Apache trên Debian 7 hoặc Ubuntu 13 VPS
2013-11-19
Cách tạo chứng chỉ SSL trên Apache cho Debian 7
2013-11-11
Cách thiết lập server ảo Apache trên Debian 7
2013-10-29
Cách cấu hình Varnish cho Drupal với Apache trên Debian và Ubuntu
2013-10-21
Cách thiết lập mod_security với Apache trên Debian / Ubuntu
2013-10-21
Cách cài đặt Apache Wave trên VPS CentOS 6.4 x64
2013-09-18
Cách cấu hình bộ nhớ đệm nội dung bằng module Apache trên VPS
2013-08-16
Cách tạo chuyển hướng tạm thời và vĩnh viễn với Apache và Nginx
2013-08-12