Thursday, August 16, 2012

Install Nginx php mysql phpmyadmin for Mac OS

Mac comes with PHP installed already, but instead of trying to get that version to work with everything I instead just used macports to install a clean version of PHP for me to configure to how I like things to run completely separate from the mac's default setup.

Install all packages

sudo port install php5 +fastcgi fcgi

Nginx Install

Enough foreplay, lets get to it, install nginx first.
  1. sudo port install nginx
Copy working configuration default into its own configuration
  1. sudo cp /opt/local/etc/nginx/nginx.conf.default /opt/local/etc/nginx/nginx.conf

If you want to launch nginx on system startup simply run the plist insalled by the port:
  1. sudo launchctl load -w /Library/LaunchDaemons/org.mackports.nginx.plist

TIP: start and stop nginx on demand from the command line, but don't do it yet! We have to configure it more first.

Start Nginx on demand:

  1. sudo nginx

Stop Nginx on demand:
  1. sudo nginx -s stop

Installing MySQL via MacPorts

I had a change of heart and decided to install mysql5 via MacPorts to keep it all under one package manager. If you've already installed MySQL using the package provided by then just skip ahead to Installing PHP with PHP-CGI. Otherwise keep reading.

Install MySQL via macports
  1. sudo port install mysql5-server
Once complete you'll need to start the mysql daemon and set a root password

  1. #start mysql daemon
  2. sudo mysqld_safe5 &
  1. sudo mysqladmin5 -u root password NEWPASSWORD

You will need to start mysql daemon whenever you wish to use it. I'd sugget making a shell command or an alias in your ~/.profile file.

  1. #~/.profile
  2. alias mysql='/opt/local/bin/mysql5'
  3. alias start_mysql='sudo mysqld_safe5 &'
  4. alias stop_mysql='mysqladmin5 --user=root --password=NEWPASSWORD shutdown'

Now you're all set with MySQL from MacPorts.

Installing PHP with PHP-CGI (FastCGI)

Like I said before, Lion comes with its own PHP install, but I much prefer to work with the package manager whenever possible, so I'm installing a fresh copy of PHP in /opt/local. Let's also install php5 with fastcgi (we need for nginx to talk to PHP) along with some of the nicer libraries we want access to for phpMyAdmin and mysql.

  1. sudo port install php5 +fastcgi fcgi php5-gd php5-mysql php5-mcrypt

Starting php-cgi:
  1. php-cgi -q -b &

Stopping PHP-CGI:
  1. sudo killall php-cgi

You'll need to start the php-cgi whenever you want nginx to talk to PHP via CGI daemon. I ended up writting a little bash to start this for me with a simple command and saved it to ~/bin/
  1. #!/bin/bash
  2. php-cgi -q -b &

Configure Nginx

Open up /opt/local/etc/nginx/nginx.conf in your favorite editor and configure it:

#user  nobody;
worker_processes  1;

error_log   /opt/local/etc/nginx/logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

pid        /opt/local/etc/nginx/logs/;

events {
    worker_connections  1024;

http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /opt/local/etc/nginx/logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        access_log  /opt/local/etc/nginx/logs/host.access.log  main;

        location / {
            root   share/nginx/html;
            index  index.html index.htm;

        #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   share/nginx/html;

        # proxy the PHP scripts to Apache listening on
        #location ~ \.php$ {
        #    proxy_pass;

        # pass the PHP scripts to FastCGI server listening on
        location ~ \.php$ {
            root           /opt/local/share/nginx/html;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /opt/local/share/nginx/html$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;

    # another virtual host using mix of IP-, name-, and port-based configuration
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   share/nginx/html;
    #        index  index.html index.htm;
    #    }

    # HTTPS server
    #server {
    #    listen       443;
    #    server_name  localhost;

    #    ssl                  on;
    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_timeout  5m;

    #    ssl_protocols  SSLv2 SSLv3 TLSv1;
    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers   on;

    #    location / {
    #        root   share/nginx/html;
    #        index  index.html index.htm;
    #    }


This is a basic nginx setup to run with PHP-CGI nicely. You'll have to add a little more to get it to work nicely with a CakePHP install, but we'll get to that soon enough. As you can see, I like to root things in /var/www, make sure this directory exists for you

  1. sudo mkdir /var/www
Lets write a testfile to see what we've got so far!
  1. sudo echo "" > /var/www/index.php

Start nginx, php-cgi and then navigate to localhost/index.php to see your hard work in all its glory.

Installing phpMyAdmin

Grab the latest version of phpMyAdmin from: (version 3.4.7 when writing) and unpack it wherever you'd like (I put mine in /opt/local/phpMyAdmin).

Since I like to keep my route in /var/www as my default for nginx, I then created a symlink between where I installed phpMyAdmin and /var/www/phpMyAdmin

  1. sudo ln -s /opt/local/phpMyAdmin /var/www/phpMyAdmin

Now navigate to http://localhost/phpMyAdmin and you should be greeted with a nice phpMyAdmin screen.

Stop and start nginx:
  1. sudo nginx -s stop
  2. sudo nginx

Add your new server_name to your /private/etc/hosts file
  1. localhost dev.testapp.devlocal

Now navigate to http://dev.testapp.devlocal on your machine and you should see your brand new baked CakePHP 2.0 app! Congratulations, happy baking!

I hope this tutorial helped, comments are appreciated.

Wednesday, August 15, 2012

Tạo ssl sử dụng https cho nginx

# Generate private key 
openssl genrsa -out ca.key 1024 

# Generate CSR 
openssl req -new -key ca.key -out ca.csr

# Generate Self Signed Key
openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.pem

# Copy the files to the correct locations
cp ca.pem /etc/pki/tls/certs
cp ca.key /etc/pki/tls/private/ca.key
cp ca.csr /etc/pki/tls/private/ca.csr
Cấu hình nginx sử dụng ssl https 
  server {
        listen       443;

        ssl                  on;
        ssl_certificate      /usr/share/nginx/html/cydia/ca.pem;
        ssl_certificate_key  /usr/share/nginx/html/cydia/ca.key;

        ssl_session_timeout  5m;

        ssl_protocols  SSLv2 SSLv3 TLSv1;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers   on;

        location / {
            root   /usr/share/nginx/html;
            index  index.php index.html index.htm;

        location ~ \.php$ {
            root           /usr/share/nginx/html;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html$fastcgi_script_name;
            include        fastcgi_params;


Sunday, August 12, 2012

9 thói quen xấu cần bỏ nếu muốn theo ngành CNTT

1. Không chịu đọc tài liệu trước khi dùng:
Đây là một trong những thói quen tệ hại nhất nhưng lại thường gặp nhất. Có lẽ thói quen này nảy sinh từ tính thân thiện của “giao diện đồ hình” (GUI) khiến cho người dùng bồi đắp thói quen mò mẫm mà không cần đọc hướng dẫn nhưng cũng sử dụng được máy. Việc này không có gì đáng ngại đối với người dùng (rất) bình thường. Tuy nhiên, nếu bạn có ý định theo đuổi ngành CNTT một cách nghiêm túc thì hãy bỏ ngay thói quen tai hại này bởi vì đây là rào cản lớn nhất cho sự phát triển. Kiến thức vững chắc không phải… mò mà ra. Tài liệu hướng dẫn không phải vô cớ mà được viết ra.

2. Đọc lướt:
Đây cũng là một thói quen tệ hại và phổ biến không kém. Ngay trên những diễn đàn, với những ý kiến và chỉ dẫn bằng tiếng Việt rất cô đọng, rành mạch và dễ hiểu nhưng vẫn có quá nhiều người chỉ đọc lướt để rồi quay lại tiếp tục thắc mắc. Đây là thói quen cực kỳ nguy hiểm bởi vì nó rèn cho trí não thói quen đọc lướt. Việc này dẫn đến chỗ kiến thức thu thập một cách hời hợt, tạm bợ và chắp vá. Nếu những ý kiến bằng tiếng Việt rất cô đọng, rành mạch và dễ hiểu nhưng vẫn không chịu khó đọc kỹ và suy gẫm thì việc tham khảo, tổng hợp các sách tiếng nước ngoài gần như là vô khả thi.

3. Bắt chước mà không suy nghĩ:
Khi bắt đầu làm quen với những thứ trong ngành CNTT, cách dễ nhất là bắt chước làm theo từng bước. Nếu cứ nhắm mắt làm theo nhưng không hề suy nghĩ lý do tại sao mình làm như vậy, không thử đặt câu hỏi những gì xảy ra đằng sau những “bước” ấy thì không chóng thì chày sẽ tạo cho mình một thói quen tai hại: bắt chước không suy nghĩ không tư duy như một cỗ máy. Từ chỗ làm theo từng bước có sẵn mà không suy nghĩ đến chỗ biến thành thói quen thì khả năng nhận định và tư duy sẽ bị thui chột. Chẳng những vậy, thói quen này kiềm hãm sự thẩm thấu kiến thức xuyên qua hàng loạt những câu hỏi. Tự đặt câu hỏi chính là cách buộc trí não mình làm việc và là viên đá đầu tiên để dấn thân vào chỗ phát triển trí tụệ.

4. Sợ khó:
Sợ khó tưởng chừng quá thông thường trên mọi lãnh vực nhưng trong lãnh vực CNTT thì thói quen “sợ khó” là thói quen giết chết ngay bước đầu làm quen và phát triển. Chẳng có ngành nghề thực thụ, đòi hỏi trí tuệ mà lại dễ dàng hết. Thói quen “sợ khó” biểu hiện từ chuyện đơn giản như học ngoại ngữ (để có thể tham khảo thêm tài liệu ngoại ngữ) cho đến chuyện tự mình đối diện với những khó khăn trong khi trau dồi kiến thức và kinh nghiệm. Thói quen này lâu dần ăn sâu và dẫn đến chỗ không muốn và không thể giải quyết được điều gì nếu chỉ cảm thấy có trở ngại. Nên tránh xa câu này: vạn sự khởi đầu nan, gian nan bắt đầu nản.

5. Viện cớ:
Quá trình tích lũy kiến thức luôn luôn có những khó khăn và trở ngại. Nếu chính bản thân mình không tự kỷ luật và tự nghiêm khắc thì chẳng còn ai trên đời này kỷ luật và nghiêm khắc giúp mình. Từ chỗ không kỷ luật và không nghiêm khắc, chỉ cần một thời gian rất ngắn có thể dẫn đến sự đổ vỡ, sợ hãi, chán nản và để bào chữa cho sự đổ vỡ thường là những viện cớ. Viện cớ chỉ để ẩn nấp sau cái cớ nhưng sự thật sụp đổ vẫn tồn tại. Tránh xa những câu như “nhà em nghèo”, “hoàn cảnh khó khăn”, “vì em là newbie” mà nên biết rằng vô số những người khác cũng như mình và thậm chí còn khó khăn hơn mình. Nên nhớ rằng, ngay khi dùng cái cớ để viện thì lúc ấy mình đã chính thức thất bại rồi.

6. “Đi tắt đón đầu”:
Trên đời này chẳng có loại tri thức đích thực nào hình thành từ “đi tắt” và “đón đầu” cả. “Mì ăn liền” có cái ngon của nó nhưng chính “mì ăn liền” không thể hình thành một bữa ăn thịnh soạn và đầy đủ. Tri thức đích thực cũng như thức ăn, nó cần điều độ, liều lượng và thời gian để… tiêu hoá. Tư duy và thói quen “đi tắt” luôn luôn dẫn đến những lổ hổng khủng khiếp trong kiến thức. Những lổ hổng ấy xem chừng không nhiều và không quan trọng khi kiến thức còn ít ỏi và nhu cầu công việc còn sơ khai. Tuy nhiên, một khi đối diện với những khó khăn và phức tạp trong công việc và trong đời sống thì những thứ “đi tắt đón đầu” là nguyên nhân sâu xa của những đổ vỡ và thất bại. Hãy nhớ: đừng đi tắt và đừng đón đầu bởi vì chẳng có cái đường tắt nào trong hành trình đi tìm tri thức.

7. “Nghe nói là…”
Cụm “nghe nói là…” là một cụm phổ biến đến độ chóng mặt. Bất cứ một ngành khoa học hay có liên quan đến khoa học không thể dựa trên “nghe nói” mà luôn luôn cần dựa trên các bằng chứng khoa học và những bằng chứng ấy cần chính xác và cụ thể. Chính vì có thói quen “nghe nói” mà đánh rớt những cơ hội tìm tòi và kiểm chứng; những cơ hội quý báu để trau dồi kiến thức và kinh nghiệm. Cái gì không rõ thì nên tìm tòi và đừng “nghe nói” mà phải được thấy, được phân tích và được kiểm chứng. Không bỏ được thói quen này thì cách tốt nhất đừng bén mảng gần bất cứ ngành khoa học nào vì chỉ chuốc lấy sự thất bại và lãng phí.

8. Niềm tin và hy vọng:
Trong khoa học, khi nói đến kết quả và sự kiến tạo hoặc thậm chí con đường đi đến sự kiến tạo và kết quả thì hoàn toàn không có chỗ cho “niềm tin” và “hy vọng” một cách mù mờ. Thói quen “restart” lại máy hay “restart” lại chương trình với “hy vọng” nó sẽ khắc phục sự cố đã trở thành thói quen cố hữu. Nếu không có điều kiện thay đổi nào khác thì có “restart” một triệu lần và hy vọng một triệu lần thì kết quả vẫn y hệt nhau. Đừng “tin” và đừng “hy vọng” vào sự thay đổi của kết quả nếu như chính bạn không kiểm soát và thay đổi để tạo thay đổi trong kết quả. Tất cả mọi hoạt động từ lập trình cho đến quản lý hệ thống, quản lý mạng, bảo mật, reverse engineering…. thậm chí đối với người dùng bình thường, khi kết quả không như ý, sự điều chỉnh là điều cần thiết thay vì lặp lại y hệt hành động và chỉ… hy vọng.

9. Không vì trí tuệ mà vì… “đẳng cấp”:
Lắm bạn lao vào ngành này không phải là vì trí tuệ, vì kiến thức, vì đóng góp một cái gì đó ích lợi cho xã hội mà là vì… đẳng cấp mơ hồ nào đó. Nếu tiếp tục lao vào và chọn lấy một muc tiêu mơ hồ thì sẽ không bao giờ đi đến đích được. “Đẳng cấp” là một thứ mơ hồ, vô ích và đầy cá nhân tính nhưng khi nó biến thành thói quen và mục tiêu để nhắm tới thì nó chẳng mang lại được gì ngoài sự thất bại ngay từ đầu vì hoàn toàn không có một phương hướng nào cả. Trau dồi kiến thức hoàn toàn khác với việc xoa dịu mặc cảm (“đẳng cấp”).

Sưu tầm từ bài viết của anh Hoàng Ngọc Diêu (HVAONLINE)

Saturday, August 11, 2012

Sửa chữa file hệ thống linux : ext2 và ext3

Error disk 
EXT3-fs error (device sdb1): ext3_lookup: unlinked inode 77358041 in dir #77332481
EXT3-fs error (device sdb1): ext3_lookup: unlinked inode 77358040 in dir #77332481

1 - file hệ thống sẽ không thể được unmount ,một khi nó đang hoạt động (
thường là báo busy khi unmount) .Cho nên chúng ta cần phải hạ hệ thống xuống chạy ở runlevel là 1 và chắc chắn rằng bạn đang chạy lệnh với permission là root

Nếu không phải disk chứa OS có thể  umount trực tiếp và fix không cần đưa về init 1
# init 1

2 - Unmount disk đang bị lỗi, ví dụ là /home file system được mount tới /dev/sda3 (partion sda3 của hdd sda) ,khi đó chúng ta cần chạy lệnh :
# umount /home
# umount /dev/sda3

3 - bây giờ chúng ta sẽ chạy fsck cho phân vùng này
# fsck /dev/sda3
Tuy nhiên nếu bạn biết chắc được kiểu định dạng của phần vùng này thì nên dùng tùy biến -t .
# fsck -t ext3 /dev/sda3
# fsck.ext3 /dev/sda3
Chú ý : nếu bạn không nhớ kiểu file ,bạn có thể gõ lệnh mount để xác định ,nó sẽ liệt kê tất cả phân vùng đang được mount và kiểu ext .

Lệnh fsck sẽ kiểm tra file system ,nó sẽ báo khi có vấn đề xuất hiện và sẽ fix .Nó sẽ bắt bạn xác nhận y (yes) nếu sửa file bị lỗi .Trường hợp bị nhiều quá mà bạn lười gõ y từng file bạn có thể dùng tùy biến -y (mặc định sửa hết)
# fsck -y /dev/sda3
Các file không thể sữa chửa và phục hồi sẽ được lưu trữ trong thư mục /home/lost+found

4 - Sau khi fsck xong ,remount lại file hệ thống
# mount /home

5 - Quay lại chế độ multiuser mode
# init 3
Bạn có thể xem man của fsck để biết thêm về các tùy biến khác .Chú ý /dev/sda3 chỉ là ví dụ ,bạn cần xác định đúng phân vùng và ổ cứng bị lỗi .
Chúc các bạn thành công 

[root@ns ~]# fsck -t ext3 /dev/sdb1
fsck 1.39 (29-May-2006)
e2fsck 1.39 (29-May-2006)
/dev/sdb1: recovering journal
/dev/sdb1 contains a file system with errors, check forced.
Pass 1: Checking inodes, blocks, and sizes
Inode 77358037, i_size is 16711680, should be 16826368.  Fix? yes

Inode 77358037, i_blocks is 32680, should be 32904.  Fix? yes 
Pass 2: Checking directory structure
Entry '363969661+1.1.3+ESPGALUDA II+AP.ipa' in /store/datanew (77332481) has deleted/unused inode 77358040.  Clear? yes

Entry '387176580+1.1.3+Dodonpachi Resurrection+AP.ipa' in /store/datanew (77332481) has deleted/unused inode 77358041.  Clear? yes

Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
Block bitmap differences:  -(338821634--338821639) -(338829533--338829535) -338832079 -(338835793--338835799) -(338843626--338843631) -(338852609--338852615) +(338867427--338867431) +(338867922--338867927) +(338869180--338869195) +338869212
Fix? yes

Free blocks count wrong for group #10341 (17487, counted=17459).
Fix? yes

Free blocks count wrong (232484352, counted=232484324).
Fix? yes

/dev/sdb1: ***** FILE SYSTEM WAS MODIFIED *****
/dev/sdb1: 27364/244203520 files (43.3% non-contiguous), 255893676/488378000 blocks
[root@ns ~]#

Wednesday, August 1, 2012

zpool tạo group disk

bash-3.2# echo |format
Searching for disks...done

       0. c0t203400A0B84700CEd31
       1. c1t203500A0B84700CEd31
       2. c3t0d0
       3. c3t1d0
       4. c3t2d0
       5. c3t3d0
       6. c5t600A0B8000330D0A0000054748BF696Bd0
       7. c5t600A0B80004700CE0000057348BF6846d0
       8. c5t600A0B80004700CE0000057748BF6AD0d0
Specify disk (enter its number): Specify disk (enter its number):  

1. Tạo group disk

bash-3.2# zpool create -f u02 c5t600A0B8000330D0A0000054748BF696Bd0 c5t600A0B80004700CE0000057348BF6846d0

bash-3.2# zpool get all u02;
u02   size           1.84T       -
u02   capacity       0%          -
u02   altroot        -           default
u02   health         ONLINE      -
u02   guid           1890458593104236169  default
u02   version        29          default
u02   bootfs         -           default
u02   delegation     on          default
u02   autoreplace    off         default
u02   cachefile      -           default
u02   failmode       wait        default
u02   listsnapshots  on          default
u02   autoexpand     off         default
u02   free           1.84T       -
u02   allocated      252K        -
u02   readonly       off         -

2. Unmount zpool 
bash-3.2# zpool export u02

Khi map volume này vào server mới

Muốn sử dụng lại 2 volume này
bash-3.2# # zpool import
  pool: u02
    id: 1890458593104236169
 state: ONLINE
action: The pool can be imported using its name or numeric identifier.

        u02                                      ONLINE
          c4t600A0B8000330D0A0000054748BF696Bd0  ONLINE
          c4t600A0B80004700CE0000057348BF6846d0  ONLINE

3. mount u02 trước đó vào testzfs

bash-3.2# zpool import u02 testzfs

Chú ý: Trong trường hợp chỉ map lên một volume thì không thể mount lên được

root@TT4-SMS-S # zpool import
  pool: testzfs
    id: 1890458593104236169
 state: UNAVAIL
status: One or more devices are missing from the system.
action: The pool cannot be imported. Attach the missing
        devices and try again.

        testzfs                                  UNAVAIL  missing device
          c4t600A0B8000330D0A0000054748BF696Bd0  ONLINE

        Additional devices are known to be part of this pool, though their
        exact configuration cannot be determined.
root@TT4-SMS-S # zpool import testzfs
cannot import 'testzfs': one or more devices is currently unavailable