Thứ tư, 14/01/2015 | 00:00 GMT+7

Cách cài đặt Nginx, MySQL và PHP (FEMP) trên FreeBSD 10.1

Nginx, MySQL và PHP có thể được kết hợp với nhau một cách dễ dàng như một giải pháp mạnh mẽ để cung cấp nội dung động trên web. Ba phần mềm này có thể được cài đặt và cấu hình trên máy FreeBSD để tạo ra cái được gọi là ngăn xếp FEMP .

Trong hướng dẫn này, ta sẽ trình bày cách cài đặt ngăn xếp FEMP trên server FreeBSD 10.1. Ta sẽ cài đặt phần mềm bằng cách sử dụng các gói để cài đặt và chạy nhanh hơn. Các gói này cung cấp các giá trị mặc định hợp lý hoạt động tốt cho hầu hết các server .

Cài đặt các thành phần

Để bắt đầu, ta sẽ cài đặt tất cả phần mềm ta cần bằng hệ thống gói FreeBSD. Lệnh "cài đặt" sẽ cập nhật bản sao local của các gói có sẵn và sau đó cài đặt các gói mà ta đã yêu cầu:

sudo pkg install nginx mysql56-server php56 php56-mysql 

Thao tác này sẽ download và cài đặt web server Nginx để phục vụ nội dung của ta , server database MySQL được sử dụng để lưu trữ thông tin và ngôn ngữ PHP processor để xử lý nội dung động.

Sau khi cài đặt hoàn tất, hãy đảm bảo chạy lệnh rehash nếu bạn đang chạy shell tcsh mặc định. Điều này làm cho shell nhận biết các ứng dụng mới bạn đã cài đặt:

rehash 

Khi hoàn tất, bạn có thể chuyển sang bắt đầu bật và cấu hình các thành phần của bạn .

Bật tất cả các dịch vụ

Trong phần cuối cùng, ta đã download ba dịch vụ riêng biệt cần chạy trên server của ta .

Để FreeBSD bắt đầu các dịch vụ này như các dịch vụ thông thường, ta cần nói với FreeBSD rằng ta muốn kích hoạt chúng. Điều này sẽ cho phép ta xử lý chúng dưới dạng dịch vụ thay vì ứng dụng một lần và nó cũng sẽ cấu hình FreeBSD để tự động khởi động chúng khi khởi động.

Đầu tiên, ta cần biết tham số rc chính xác để đặt cho mỗi dịch vụ. Các tập lệnh dịch vụ, nằm trong folder /usr/local/etc/rc.d , xác định tham số sẽ được sử dụng để kích hoạt từng server bằng cách sử dụng biến rcvar . Ta có thể xem rcvar của mỗi dịch vụ được đặt thành gì bằng lệnh :

grep rcvar /usr/local/etc/rc.d/* 

Bạn sẽ nhận được một danh sách như thế này:

/usr/local/etc/rc.d/avahi-daemon:rcvar=avahi_daemon_enable /usr/local/etc/rc.d/avahi-dnsconfd:rcvar=avahi_dnsconfd_enable /usr/local/etc/rc.d/dbus:rcvar=dbus_enable /usr/local/etc/rc.d/mysql-server:rcvar=mysql_enable /usr/local/etc/rc.d/nginx:rcvar=nginx_enable /usr/local/etc/rc.d/php-fpm:rcvar=php_fpm_enable /usr/local/etc/rc.d/rsyncd:rcvar=rsyncd_enable 

Như bạn thấy , điều này cho phép ta dễ dàng xuất ra tham số mà ta cần đặt cho mỗi dịch vụ của bạn . Bản thân tên của script (thành phần cuối cùng của đường dẫn cho đến ký tự dấu hai chấm) cũng đáng chú ý vì nó cho ta biết tên thực mà FreeBSD sử dụng cho dịch vụ.

Để kích hoạt các dịch vụ này, ta sẽ chỉnh sửa file /etc/rc.conf với các quyền sudo:

sudo vi /etc/rc.conf 

Bên trong, ta sẽ thêm một dòng cho mỗi dịch vụ mà ta muốn bắt đầu. Ta có thể sử dụng thông số rcvar mà ta đã phát hiện cho từng dịch vụ và đặt nó thành “CÓ” để bật từng dịch vụ:

mysql_enable="YES" nginx_enable="YES" php_fpm_enable="YES" 

Lưu file khi bạn hoàn tất.

Cấu hình PHP

Tiếp theo, ta sẽ cấu hình dịch vụ PHP-FPM, dịch vụ này sẽ chịu trách nhiệm xử lý các yêu cầu PHP được gửi từ web server của ta .

Để bắt đầu, hãy thay đổi thành folder /usr/local/etc , nơi các file cấu hình cho các chương trình tùy chọn của ta được lưu trữ:

cd /usr/local/etc 

Có một số file cấu hình PHP trong folder này mà ta muốn sửa đổi. Ta sẽ bắt đầu với file cấu hình PHP-FPM. Mở cái này với các quyền của sudo :

sudo vi php-fpm.conf 

Bên trong, ta muốn điều chỉnh một vài tùy chọn khác nhau. Đầu tiên, ta muốn cấu hình PHP-FPM để sử dụng socket Unix thay vì cổng mạng để giao tiếp. Điều này an toàn hơn cho các dịch vụ giao tiếp trong một server .

Tìm dòng trông giống như sau:

listen = 127.0.0.1:9000 

Thay đổi điều này để sử dụng một socket trong folder /var/run :

listen = /var/run/php-fpm.sock 

Tiếp theo, ta sẽ cấu hình chủ sở hữu, group và bộ quyền của socket sẽ được tạo. Có một group tùy chọn được comment xử lý cấu hình này trông giống như sau:

;listen.owner = www ;listen.group = www ;listen.mode = 0660 

Bật những điều này bằng cách xóa điểm đánh dấu comment ở đầu:

listen.owner = www listen.group = www listen.mode = 0660 

Lưu file khi bạn hoàn tất.

Tiếp theo, ta cần tạo một file php.ini sẽ cấu hình hành vi chung của PHP. Hai file mẫu đã được bao gồm mà ta có thể chọn để sao chép vào file php.ini mà PHP đọc.

Tệp php.ini-production sẽ gần hơn với những gì ta cần, vì vậy ta sẽ sử dụng file đó. Sao chép version production sang file PHP kiểm tra:

sudo cp php.ini-production php.ini 

Mở file để chỉnh sửa với quyền sudo :

sudo vi php.ini 

Bên trong, ta cần tìm một phần cấu hình hành vi cgi.fix_pathinfo . Nó sẽ được comment ra và đặt thành “1” theo mặc định. Ta cần bỏ ghi chú điều này và đặt nó thành “0”. Điều này sẽ ngăn PHP cố gắng thực thi các phần của đường dẫn nếu không tìm thấy file được chuyển vào để xử lý. Điều này có thể được user độc hại sử dụng để thực thi mã tùy ý nếu ta không ngăn chặn hành vi này.

Bỏ comment cig.fix_pathinfo và đặt nó thành “0”:

cgi.fix_pathinfo=0 

Lưu file khi bạn hoàn tất.

Bây giờ ta đã cấu hình xong PHP-FPM, ta có thể bắt đầu dịch vụ bằng lệnh :

sudo service php-fpm start 

Bây giờ ta có thể chuyển sang cấu hình version MySQL của bạn .

Cấu hình MySQL

Để bắt đầu cấu hình MySQL, ta cần khởi động dịch vụ MySQL:

sudo service mysql-server start 

Lần đầu tiên bạn chạy lệnh này, nó sẽ tạo cấu trúc folder cần thiết trong hệ thống file và cài đặt các file database mà nó cần. Sau đó, nó sẽ bắt đầu quá trình server MySQL.

Sau khi dịch vụ được khởi động, ta cần bảo mật cài đặt. Điều này có thể được thực hiện thông qua một tập lệnh có tên là mysql_secure_installation . Chạy điều này với quyền sudo để khóa một số mặc định không an toàn:

sudo mysql_secure_installation 
. . .  Enter current password for root (enter for none): 

Tập lệnh sẽ bắt đầu bằng cách yêu cầu bạn nhập password hiện tại cho account root MySQL. Vì ta chưa đặt password cho user này, ta có thể nhấn "ENTER" để bỏ qua dấu nhắc này.

Set root password? [Y/n] 

Tiếp theo, nó sẽ hỏi bạn có muốn đặt password của account root MySQL hay không. Nhấn “ENTER” để chấp nhận đề xuất này. Chọn và xác nhận password quản trị.

Sau đó, tập lệnh sẽ tiếp tục với các đề xuất bổ sung sẽ giúp đảo ngược một số điều kiện không an toàn trong cài đặt MySQL mặc định. Chỉ cần nhấn “ENTER” qua tất cả các dấu nhắc này để hoàn thành tất cả các hành động được đề xuất.

Ta có thể khởi động lại dịch vụ MySQL đảm bảo rằng version của ta ngay lập tức áp dụng các thay đổi bảo mật:

sudo service mysql-server restart 

Phiên bản MySQL của ta hiện đang hoạt động theo cách ta muốn, vì vậy ta có thể tiếp tục.

Cấu hình Nginx

Nhiệm vụ tiếp theo của ta là cài đặt Nginx. Để bắt đầu, ta cần khởi động web server :

sudo service nginx start 

Bây giờ, ta có thể bắt đầu cấu hình Nginx bằng cách truy cập folder nginx trong folder /usr/local/etc :

cd /usr/local/etc/nginx 

Tại đây, ta cần mở file cấu hình Nginx chính với các quyền sudo :

sudo vi nginx.conf 

Bên trong, ta có thể bắt đầu áp dụng các thay đổi để version Nginx của ta có thể hoạt động với các thành phần khác của ta .

Để bắt đầu, hãy bỏ ghi chú và sửa đổi chỉ thị user ở đầu file . Ta cần web server hoạt động với quyền là user www , vì đó là những gì version PHP-FPM của ta đang tìm kiếm:

user www; 

Ta cũng nên đặt worker_processes thành số CPU hoặc lõi mà hệ thống của bạn có. (Để biết server của bạn có bao nhiêu CPU, hãy nhập sysctl hw.ncpu từ dòng lệnh):

worker_processes 2; 

Tiếp theo, ta sẽ đặt độ chi tiết và vị trí của lỗi bằng cách sử dụng chỉ thị error_log . Ta sẽ đăng nhập vào một vị trí tại /var/log/nginx/error.log ở cấp log info :

error_log /var/log/nginx/error.log info; 

Trong khối http , ta cũng sẽ cài đặt log truy cập. Điều này sẽ được đặt tại /var/log/nginx/access.log :

access_log /var/log/nginx/access.log; 

Trong khối server , ta cần sửa đổi chỉ thị server_name để sử dụng domain hoặc địa chỉ IP của server của ta . Ta có thể làm cho server của bạn phản hồi với tên server www bằng cách thêm tên đó vào sau domain chính:

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

Cấu hình các index thị rootindex trong khối server chính. Gốc tài liệu của ta sẽ là /usr/local/www/nginx và chỉ thị index của ta phải cố gắng phục vụ các index.php trước khi quay trở lại index.html hoặc index.htm .

Vì ta đã xác định các chỉ thị này trong ngữ cảnh server , ta không cần chúng trong location / khối. Trong khối này, thay vào đó, ta sẽ cấu hình chỉ thị try_files để cố gắng cung cấp các yêu cầu của user dưới dạng file và sau đó là folder trước khi gặp lỗi 404:

server {      . . .      root /usr/local/www/nginx;     index index.php index.html index.htm;      location / {         try_files $uri $uri/ =404;     }      . . . 

Cuối cùng, ta cần cấu hình một khối vị trí sẽ xử lý các file PHP. Khối này sẽ trùng với bất kỳ yêu cầu nào kết thúc bằng .php . Nó sẽ chỉ tự xử lý các file , trả lại lỗi 404 nếu không tìm thấy file .

Ta sẽ sử dụng socket mà ta đã cấu hình trong file php-fpm.conf trước đó. Ta cũng sẽ cấu hình một số tùy chọn proxy FastCGI khác, một phần bằng cách đọc các tham số từ file fastcgi_params . Ta cần đặt tham số SCRIPT_FILENAME một cách rõ ràng để PHP biết những file nào sẽ thực thi:

server {      . . .      location ~ \.php$ {         try_files $uri =404;         fastcgi_split_path_info ^(.+\.php)(/.+)$;         fastcgi_pass unix:/var/run/php-fpm.sock;         fastcgi_index index.php;         fastcgi_param SCRIPT_FILENAME $request_filename;         include fastcgi_params;     } 

Tất cả cùng với các comment đã bị xóa, file sẽ trông giống như sau:

user  www; worker_processes  2; error_log /var/log/nginx/error.log info;  events {     worker_connections  1024; }  http {     include       mime.types;     default_type  application/octet-stream;      access_log /var/log/nginx/access.log;      sendfile        on;     keepalive_timeout  65;      server {         listen       80;         server_name  example.com www.example.com;         root /usr/local/www/nginx;         index index.php index.html index.htm;          location / {             try_files $uri $uri/ =404;         }          error_page      500 502 503 504  /50x.html;         location = /50x.html {             root /usr/local/www/nginx-dist;         }          location ~ \.php$ {                 try_files $uri =404;                 fastcgi_split_path_info ^(.+\.php)(/.+)$;                 fastcgi_pass unix:/var/run/php-fpm.sock;                 fastcgi_index index.php;                 fastcgi_param SCRIPT_FILENAME $request_filename;                 include fastcgi_params;         }     } } 

Lưu file khi bạn hoàn tất.

Bây giờ ta cần tạo folder log và các file mà ta đã tham chiếu trong file của bạn . Đầu tiên, tạo folder /var/log/nginx :

sudo mkdir -p /var/log/nginx 

Tiếp theo, ta có thể tạo các file log trống:

sudo touch /var/log/nginx/access.log sudo touch /var/log/nginx/error.log 

Bây giờ, ta đã sẵn sàng để cấu hình root tài liệu của bạn . Ta đã cấu hình folder root của bạn thành /usr/local/www/nginx , nhưng hiện tại, đây là một softlink đến folder /usr/local/www/nginx-dist có thể được cập nhật bằng hoạt động gói trong tương lai.

Ta nên hủy liên kết và tạo lại folder đã hủy liên kết:

sudo rm /usr/local/www/nginx sudo mkdir /usr/local/www/nginx 

Vì ta vẫn cần kiểm tra web server của bạn , ta có thể sao chép index.html vào folder root của web mới:

sudo cp /usr/local/www/nginx-dist/index.html /usr/local/www/nginx 

Trong khi ta ở đây, ta cũng nên tạo một file info.php tạm thời mà ta có thể sử dụng để kiểm tra khả năng của Nginx trong việc chuyển yêu cầu tới PHP-FPM. Tạo file trong folder root với các quyền sudo :

sudo vi /usr/local/www/nginx/info.php 

Trong file , nhập nội dung sau. Điều này sẽ tạo ra một trang HTML với thông tin về cấu hình PHP của ta :

<?php phpinfo(); ?> 

Lưu file khi bạn hoàn tất.

Bây giờ ta đã sẵn sàng khởi động lại Nginx để tận dụng cấu hình mới của ta . Trước tiên, hãy kiểm tra file cấu hình của bạn để tìm lỗi cú pháp bằng lệnh :

sudo nginx -t 

Nếu file cấu hình của bạn không có lỗi cú pháp có thể phát hiện được, bạn sẽ thấy một cái gì đó trông giống như sau:

nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful 

Nếu lệnh trên trả về có lỗi, hãy mở lại file cấu hình Nginx đến vị trí tìm thấy lỗi và cố gắng khắc phục sự cố.

Khi cấu hình của bạn kiểm tra chính xác, ta có thể khởi động lại Nginx:

sudo service nginx restart 

Kiểm tra kết quả

Ngăn xếp web của ta hiện đã hoàn thành. Tất cả những gì ta còn lại để làm là kiểm tra nó.

Trong trình duyệt web , hãy bắt đầu bằng cách truy cập domain cơ sở của bạn hoặc địa chỉ IP của server :

http://example.com 

Bạn sẽ thấy nội dung của index.html mà ta đã sao chép. Nó trông giống như sau :

Chỉ mục mặc định FreeBSD Nginx

Điều này cho thấy rằng Nginx đang hoạt động và có khả năng cung cấp các trang HTML đơn giản.

Tiếp theo, ta nên kiểm tra file info.php mà ta đã tạo. Trong trình duyệt của bạn, hãy truy cập domain hoặc địa chỉ IP server của bạn, theo sau là /info.php :

http://example.com/info.php 

Bạn sẽ thấy một trang thông tin PHP được tạo giống như sau:

Trang thông tin php FreeBSD

Nếu bạn có thể thấy trang này, bạn đã cấu hình thành công ngăn xếp FEMP trên server FreeBSD của bạn .

Sau khi kiểm tra cấu hình của bạn, bạn nên xóa file info.php khỏi root tài liệu của bạn vì nó có thể cung cấp một số thông tin nhạy cảm về cài đặt của bạn:

sudo rm /usr/local/www/nginx/info.php 

Bạn luôn có thể dễ dàng tạo lại file này sau đó.

Kết luận

Đến đây bạn sẽ có một web server đầy đủ chức năng được cung cấp bởi Nginx có thể xử lý nội dung PHP động và sử dụng MySQL để lưu trữ dữ liệu. Cấu hình này được dùng làm cơ sở cho nhiều loại cấu hình và ứng dụng web khác.


Tags:

Các tin liên quan

Cách cài đặt WordPress với Nginx trên server FreeBSD 10.1
2015-01-14
Hiểu và triển khai FastCGI Proxying trong Nginx
2014-12-08
Hiểu về Nginx HTTP Proxying, Cân bằng tải, Bộ đệm và Bộ nhớ đệm
2014-11-25
Hiểu cấu trúc tệp cấu hình và khung cấu hình Nginx
2014-11-19
Cách cài đặt MoinMoin với Nginx trên Ubuntu 14.04
2014-11-19
Hiểu server Nginx và các thuật toán lựa chọn khối vị trí
2014-11-17
Cách thiết lập server block Nginx trên CentOS 7
2014-11-05
Cách sử dụng tệp bản đồ Salt Cloud để triển khai server ứng dụng và reverse-proxy Nginx
2014-10-27
Cách triển khai ứng dụng Rails với Passenger và Nginx trên Ubuntu 14.04
2014-10-09
Cách tạo profile AppArmor cho Nginx trên Ubuntu 14.04
2014-10-06