Showing posts with label Apache. Show all posts
Showing posts with label Apache. Show all posts

June 6, 2015

Hướng dẫn khắc phục lỗi Apache: No space left on device

1. Giới thiệu
Bỗng dưng 1 ngày các website trên VPS hay Server không hoạt động trong khi VPS - Server vẫn hoạt động, vẫn có thể vẫn ssh vào hệ thống.
Tuy nhiên, khi thực hiện lệnh: service httpd restart hoặc /etc/init.d/httpd restart thì không thể được và check log httpd bằng lệnh: tail -100 /var/log/httpd/error_log xuất hiện lỗi No space left on device: Couldn’t create accept lock

2. Thực hiện
Bài viết này vHost sẽ hướng dẫn cách fix lỗi này để website có thể hoạt động trở lại
Step 1: Check error-log service httpd
  • tail -100 /var/log/httpd/error_log
Step 2: Thực hiện lệnh: ipcs -s


Step 3: Nếu xuất hiện như hình trên với nhiều record, thực hiện lệnh dưới đây để thao tác xóa:
  • for i in `ipcs -s | awk '/httpd/ {print $2}'`; do (ipcrm -s $i); done
Step 4: Thêm 2 thông số sau để tăng semaphores hạn chế tình trạng này trong /etc/sysctl.conf
  • kernel.msgmni = 1024
  • kernel.sem = 250 256000 32 1024
Step 5: Tiếp tục chạy lệnh sau để lưu thay đổi:

  • sysctl -p

CÁCH THIẾT LẬP NGINX LÀM PROXY CHO APACHE

Cách đây cũng mấy ngày rồi mình có đăng một bài case study về việc tối ưu cho một website WordPress có hàng trăm user online cùng lúc với server chỉ có 2GB RAM và 1 CPU. Do có nhiều bạn yêu cầu nên ở bài này mình sẽ hướng dẫn chi tiết cách cài đặt một Webserver sử dụng Apache và có NGINX làm proxy để tải các dữ liệu tĩnh.
Tuy nhiên, ở bài này mình chỉ hướng dẫn cài đặt cho server chạy 1 website duy nhất, còn chạy nhiều website thì bạn có thể test rồi tự đúc kết.

Tổng quan về kỹ thuật

nginx apache proxy
Như các bạn cũng đã biết là Apache là một Open Source Webserver phổ biến nhất hiện nay bởi vì có rất nhiều software tuyệt vời hỗ trợ cho nó như cPanel, DirectAdmin,…điều mà NGINX chưa có. Số lượng người dùng cũng rất đông đảo và hầu như 90% shared host sử dụng Apache. Trong WordPress, nếu bạn sử dụng Apache thì cũng sẽ có lợi hơn vì toàn bộ các plugin có yêu cầu bạn sửa đổi file cấu hình của Webserver đều hoạt động rất tốt trên Apache, cụ thể hơn là các plugin đó yêu cầu bạn sửa file .htaccess.
Tuy nhiên nhược điểm của Apache là kém linh hoạt, xử lý hơi chậm và quan trọng nhất là chiếm khá nhiều bộ nhớ mỗi khi xử lý bất kỳ dữ liệu nào, dù nó là tĩnh hay động.
Và rồi, chúng ta đến với NGINX như một giải pháp thay thế cho Apache vì NGINX xử lý nhanh hơn, linh hoạt hơn (sử dụng trong nhiều mục đích khác nhau) và nhẹ hơn Apache rất nhiều. Cách cấu hình của NGINX cũng gọn gàng và đơn giản hơn.
Nhưng có một vấn đề là nếu bạn sử dụng NGINX như một Webserver chính để xử lý các dữ liệu PHP (như serie LEMP của mình) thì đôi lúc nó sẽ hoạt động không đúng như ý muốn, mà nói đơn giản hơn là nếu bạn dùng trong WordPress thì sẽ phải cần khả năng tự cấu hình rất nhiều, điều này không mấy dễ chịu cho newbie.
May mắn thay, bản thân NGINX rất đa nhiệm nên chúng ta có thể sử dụng nó đồng hành cùng với Apache mà không gây ảnh hưởng gì, thậm chí bạn còn tiết kiệm được nhiều tài nguyên hơn, website tải nhanh hơn nữa. Một kỹ thuật thông dụng nhất để sử dụng NGINX cùng với Apache là làm proxy trung gian để gửi dữ liệu đã xử lý thông qua Apache đến trình duyệt của người dùng. Nếu bạn nào đã và đang lập trình Ruby cho việc làm web thì chắc chắn sẽ biết NGINX còn được sử dụng để làm proxy cho Passenger, Unicorn hay THIN.
Ở đây, chúng ta sẽ sử dụng Apache để xử lý PHP thông qua module mod_php của nó, còn NGINX sẽ có nhiệm vụ đọc dữ liệu nhận được, xử lý các file tĩnh, cache (NGINX làm rất tốt trong việc xử lý cache).

Nó hoạt động thế nào?

Như bạn cũng biết, trình duyệt sẽ đọc dữ liệu từ server truyền về thông qua cổng 80 và mặc định khi cài NGINX hay Apache nó cũng đều được sử dụng cổng này. Nhưng bây giờ, chúng ta sẽ cho Apache cho một cổng nào đó (8080 chẳng hạn) mà trình duyệt sẽ không đọc trực tiếp được, rồi chúng ta sẽ sử dụng cổng 80 cho NGINX, lúc này NGINX sẽ tự động gửi các truy vấn từ các file có đuôi mở rộng là .php đến cổng của Apache cho nó xử lý rồi Apache trả dữ liệu lại cho NGINX rồi NGINX gửi cho người dùng đọc.

Chi tiết cách cài đặt

Bây giờ, mình sẽ hướng dẫn các bạn cài đặt từ A đến Z một webserver sử dụng Apache và NGINX, cài đặt PHP và các extensions cần thiết. Riêng database thì bạn có thể cài MariaDB như bài này.

Chuẩn bị server

  • Hệ điều hành CentOS 6.5 (nếu bạn chọn CentOS 7 thì không thể làm theo hướng dẫn này, mình sẽ có tutorial riêng cho CentOS 7).
  • RAM tối thiểu 512MB và trung bình là 1GB.
  • User root.

Bước 1. Cài Apache và thiết lập

Ta tiến hành cài Apache vào trước nhé.
yum install httpd
Sau đó mở file /etc/httpd/conf/httpd.conf, tìm:
Listen 80
Sửa port 80 thành 8080.
Tiếp tục tìm:
# First, we configure the "default" to be a very restrictive set of
# features.
#
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
Thay AllowOverride None thành AllowOverride All.
Ok, tạm lưu lại, bây giờ hãy tạo các thư mục chứa dữ liệu website để tí nữa ta sẽ thêm VirtualHost vào Apache. Ví dụ mình cần thêm example.com vào server với đường dẫn lưu là /home/example.com thì sẽ tạo như sau:
mkdir -p /home/example.com/public_html
mkdir -p /home/example.com/log
touch /home/example.com/log/error.log
chown -R apache:apache /home/example.com/
Tiếp tục mở lại file /etc/httpd/conf/httpd.conf và tìm dòng:
#NameVirtualHost *:80
Đổi thành:
NameVirtualHost *:8080
Nhìn ngay xuống dưới sẽ thấy đoạn này:
#<VirtualHost *:80>
# ServerAdmin webmaster@dummy-host.example.com
# DocumentRoot /www/docs/dummy-host.example.com
# ServerName dummy-host.example.com
# ErrorLog logs/dummy-host.example.com-error_log
# CustomLog logs/dummy-host.example.com-access_log common
#</VirtualHost>
Bỏ comment, thay port và đổi đường dẫn thành như dưới đây:
<VirtualHost *:8080>
ServerAdmin contact@thachpham.com
DocumentRoot /home/example.com/public_html
ServerName www.example.com
ServerAlias example.com
ErrorLog /home/example.com/log/error.log
# CustomLog logs/dummy-host.example.com-access_log common
</VirtualHost>
Xem hình chụp cho chắc cú nha:
nginxproxy apachevhost
Ok, bây giờ hãy lưu lại và kích hoạt Apache lên, và cho nó tự khởi động khi reboot.
service httpd start
chkconfig httpd on
[root@nginxproxy ~]# service httpd start Starting httpd: httpd: apr_sockaddr_info_get() failed for nginxproxy httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName [OK ]
Bạn có thể gõ netstat -ntlup để kiểm tra, nếu httpd đang đọc qua port 8080 là chính xác.
nginxproxy checkapacheport

Bước 2. Cài đặt NGINX và cấu hình

Mình sẽ sử dụng NGINX phiên bản mới nhất nên bạn cần nạp package này vào bằng cách tạo file /etc/yum.repos.d/nginx.repo rồi bỏ đoạn sau vào:
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
Cài NGINX.
yum install nginx
Sau đó mở file /etc/nginx/conf.d/default.conf rồi xóa toàn bộ nội dung trong đó và copy đoạn dưới đây bỏ vào, mục đích là nhìn cho nó gọn hơn vì ta chỉ cần dùng vài chức năng thôi:
server {
    listen       80;
    server_name  example.com;
 
    #charset koi8-r;
    #access_log  /var/log/nginx/log/host.access.log  main;
 
    location / {
                proxy_pass   http://111.222.333:8080;
    }
 
    #error_page  404              /404.html;
 
    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
 
    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
 
    location ~ \.php$ {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $host;
        proxy_pass http://127.0.0.1:8080;
    }
 
    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}
 
    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    location ~ /\.ht {
        deny  all;
    }
}
  • Bạn hãy sửa lại thành domain của bạn ở dòng 03.
  • Sửa 111.222.333 thành IP server của bạn ở dòng 09.
Sau đó lưu lại và khởi động NGINX, đồng thời cho nó tự khởi động khi reboot:
service nginx start
chkconfig nginx on

Bước 3. Cài đặt PHP và các extensions liên quan

Cũng nên nói lại rằng mặc dù chúng ta sẽ sử dụng NGINX nhưng sẽ không cài PHP-FPM để làm handler cho NGINX để xử lý PHP mà đã có Apache lo rồi, do đó chúng ta chỉ cần cài PHP vào là đủ.
PHP ở đây mình sẽ dùng PHP 5.6 vì có thể sử dụng Opcache được.
Đầu tiên là nạp 2 package này vào:
rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
Sau đó cài php và php-mysql vào bằng lệnh dưới đây:
yum --enablerepo=remi,remi-php56 install php php-mysql php-devel php-gd
Nếu bạn thích thì có thể cài thêm một số software sau, có sẵn trong pack php56 rồi:
  • php-opcache: Zend Opcache.
  • php-pecl-apcu: APC Opcode Cache.
  • php-pecl-memcached: Memcached Server
  • php-pecl-memcache: Memcache Client
Lưu ý là các software trên đều nằm trong pack php56 mới nạp nhưng pack này không được kích hoạt nên bạn muốn cài phải gõ là:
yum --enablerepo=remi,remi-php56 install [tên-software]
Sau khi cài xong PHP (và các extensions nếu có), hãy gõ lệnh php -v để xem phiên bản hiện tại của PHP.
[root@nginxproxy ~]# php -v
PHP 5.6.2 (cli) (built: Oct 16 2014 09:08:04)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2014 Zend Technologies
Bây giờ hãy tạo 1 file tên là info.php trong thư mục /home/example.com/public_html có nội dung là:
<php phpinfo(); ?>
Bây giờ hãy truy cập vào tên miền http://example.com/info.php và xem phần Server API có phải là Apache 2.0 Handler hay không, nếu phải thì thành công.
nginxproxy finish
Và hãy thử xem HTTP Header của file này xem có phải sử dụng NGINX hay không nhé.
curl -I http://111.222.333/info.php
HTTP/1.1 200 OK Server: nginx/1.7.6 Date: Tue, 21 Oct 2014 00:37:10 GMT Content-Type: text/html; charset=UTF-8 Connection: keep-alive X-Powered-By: PHP/5.6.2
Ok, thành công rồi đó.
Giờ để có thể chạy được WordPress, bạn có thể cài MySQL hoặc MariaDB vào, mình khuyến khích dùng MariaDB.
Nếu bạn nào đang dùng Apache rồi và muốn áp dụng kỹ thuật này thì chỉ cần cài thêm NGINX (không khuyến khích làm nếu bạn dùng bất kỳ control panel nào như cPanel, DirectAdmin, Koloxo,….)

Fix lỗi redirect sang IP trên WordPress

Nếu bạn làm theo bài này mà bị lỗi Loop về IP của server thì hãy chèn đoạn sau vào file functions.php
remove_filter('template_redirect', 'redirect_canonical');
Và trong bài case study, mình đã có nói qua về các tham số để tối ưu PHP và MariaDB, bạn có thể xem rồi cấu hình theo.
Chúc bạn làm thành công

June 5, 2015

How to fix Apache – "Could not reliably determine the server’s fully qualified domain name, using 127.0.1.1 for ServerName" Error on Ubuntu

You might probably faced the same following error while you were restarting the Apache server on Ubuntu.
aslam@aslam:~$ sudo /etc/init.d/apache2 restart
* Restarting web server apache2                                                apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
... waiting apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
To fix that problem, you need to edit the httpd.conf file. Open the terminal and type,
sudo gedit /etc/apache2/httpd.conf
By default httpd.conf file will be blank. Now, simply add the following line to the file.
ServerName localhost
Save the file and exit from gEdit. Finally restart the server.
sudo /etc/init.d/apa

Cài đặt Apache và PHP trên CentOS

1. Cài đặt Apache
Dùng lệnh để tải gói và cài đặt.
?
1
yum install httpd
Cấu hình Apache khởi động cùng với Server.
Sau đó khởi động Apache:
?
1
service httpd start
Test thử quá trình cài đặt đã thành công hay chưa. Vào trình duyệt gõ http://localhost
Trên CentOs, thư mục lưu trữ web mặc định của Apache được lưu ở đường dẫn /var/www/html và tệp tin cấu hình được lưu tại /etc/httpd/conf/httpd.conf. Các file cấu hình khác được lưu tại thư mục /etc/httpd/conf.d/

2. Cài đặt PHP:
Cài đặt php bằng lệnh
?
1
yum install php
Sau đó ta khởi động lại Apache
?
1
service httpd restart
Test xen quá trình cài module PHP đã thành công hay chưa, ta tạo 1 file info.php chứa trong /var/www/html với nội dung như sau:
?
1
2
3
<?php
phpinfo();
?>
Mở trình duyệt và truy cập vào link http://localhost/info.php sẽ thấy kết quả như hình:

Hỗ trợ MySQL cho PHP5
Trước tiên bạn cần cài đặt MySQL trước, bạn có thể xem cách cài đặt MySQL Server trên CentOS tại đây
Để hỗ trợ MySQL cho PHP5, ta cần cài đặt thêm gói php-mysql
Đánh lệnh sau để tìm các gói cần thiết
?
1
yum search php
Ở đây mình cài các gói sau:
?
1
yum install php-mysql php-gd php-imap php-ldap php-odbc php-pear php-xml php-xmlrpc
Sau khi cài xong, ta tiến hành khởi động lại Apache
?
1
service httpd restart
Truy cập vào lại link http://localhost/info.php ta sẽ thấy kết quả như hình sau

Quá trình cài đặt như vậy là thành công, trong bài viết sau mình sẽ hướng dẫn cách cài đặt và cấu hình phpMyAdmin trên CentOS :).