Bài 8: Cấu hình webserver trên Centos

HTTP là một giao thức cho phép trình duyệt Web Browser và servers có thể giao tiếp với nhau. Nó chuẩn hoá các thao tác cơ bản mà một Web Server phải làm được. HTTP bắt đầu là 1 giao thức đơn giản giống như với các giao thức chuẩn khác trên Internet, thông tin điều khiển được truyền dưới dạng văn bản thô thông qua kết nối TCP. Do đó, kết nối HTTP có thể thay thế bằng cách dùng lệnh “telnet” chuẩn.

  • Apache là một phần mềm có nhiều tính năng mạnh và linh hoạt dùng để làm Web Server .
  • Hỗ trợ đầy đủ những giao thức HTTP trước đây như HTTP/1.1
  • Có thể cấu hình và mở rộng với những module của công ty thứ ba
  • Cung cấp source code đầy đủ với license không hạn chế.
  • Chạy trên nhiều hệ điều hành như Windows NT/9x, Netware 5.x, OS/2 và trên hầu hết các hệ điều hành Unix.

1. Cài đặt Apache (httpd) + php:

Cú pháp lệnh như sau :

yum –y install httpd php php-devel php-gd php-imap php-ldap php-mysql php-odbc php-pear php-xml php-xmlrpc php-mbstring php-mcrypt php-mhash gettext

Hoặc đơn giản là yum –y install httpd* php*

Cho dịch vụ ở chế độ auto start: Chkconfig httpd on
Start dịch vụ httpd: Service httpd start

Khi start có lẽ sẽ có thông báo lỗi do chưa cấu hình nameserver trong file /etc/httpd/conf/httpd.conf tìm đến dòng 265 và thay đổi server name cho phù hợp. Ngoài ra có một vài thông số ban đầu nên thay đổi như sau trong httpd.conf:

[root@www ~]# vi /etc/httpd/conf/httpd.conf

# line 251: Admin’s address

ServerAdmin root@server.world

# line 265: server’s name

ServerName http://www.server.world:80

# line 391: thêm index.php như bên dưới

DirectoryIndex index.php index.html

note: Apache thì thư mục gốc nằm ở /var/www/html tới đây thì có thể test thử được webserver bằng cách tạo thử một file index.html trong /var/www/html và sau đó test thử php bằng cách thay thế index.html lúc này thành index.php có nội dung như sau:

<?php phpinfo(); ?>

Kết quả sẽ được là:

image

2. Cài đặt MySQL:

Thực hiện lệnh: yum –y install mysql mysql-server
Cho dịch vụ ở chế độ auto start: Chkconfig mysqld on
Start dịch vụ httpd: Service mysqld start

Chú ý tạ đây có một số lỗi có thể sẽ phát sinh do server không phân giải được tên máy chủ vui lòng chỉnh lại DNS record

image

note: MySQl thì user mặc định là “root” và không có password.

3. Cài đặt phpMyAdmin:

cd /var/www/html {vào thư mục gốc apache}

Tìm url gói phpMyAdmin mới nhất tại http://www.phpmyadmin.net/home_page/downloads.php

unzip phpMyAdmin-3.2.4-all-languages.zip {download rồi thì giải nén}

Đổi tên thư mục gọn lại thành phpmyadmin bằng lệnh

mv phpMyAdmin-3.2.2-all-languages phpmyadmin

Đổi tên file config.sample.inc.php trong thư mục phpMyAdmin mới giải nén thành config.inc.php. có thể dùng lệnh

cp config.sample.inc.php config.inc.php

Tìm dòng:

$cfg[‘Servers’][$i][‘auth_type’] = ‘cookie’;
đổi thành:
$cfg[‘Servers’][$i][‘auth_type’] = ‘http’;

Xong bạn có thể truy cập phpMyAdmin: http://IP hoac domain/phpmyadmin

Sau đó restart dịch vụ :

Service httpd restart

note: Tuy nhiên có thể gói php của bạn version thấp và không phù hợp với phiên phản phpMyAdmin vậy bạn cần nâng cấp nó, trong trờng hợp của tôi là từ 5.1 lên 5.2 như sau:

# wget -q -O - http://www.atomicorp.com/installers/atomic |sh

Bất đầu quá trình update bằng cú pháp sau

yum update mysql php

Tới đây chúng ta đã sẵn sàng đăng nhập vào phpmyadmin bằng user mặc định là root và password rỗng

image

Tuy nhiên khi gặp tình trạng không vào được chúng ta phải đổi password mặc định lai bằng lệnh

$ mysqladmin -u root password NEWPASSWORD

Giờ đã có thể đăng nhập bình thường

image

4. Kết nối database dùng Navicat

Ngoài sử dụng Phpmyadmin như một giao diện quản lý chính còn có một số bạn thích dùng Navicat cho việc là quản lý từ xa tuy nhiên ban đầu khi mới thiết lập xong Mysql sẽ không thành công với thông báo đơn giản như:

1130 Host “localhost” is not allowed to connect this mysql server

Chứng tỏ rằng do tài khoản sử dụng remote không có quyền remote từ máy này thay vào đó chúng ta phải tạo một user mới cho phép kết nối từ bất cứ đâu trong giao diện phpmyadmin

image

5. Sử dụng tính năng Alias trong apache

Alias có vai trò trong việc ánh xạ đường dẫn cục bộ (không nằm trong DocumentRoot) thành tên đường

dẫn địa chỉ URL.Cú pháp:

Alias <đường dẫn http><đường dẫn cục bộ>

Ví dụ: Alias /doc /usr/share/doc

Khi truy cập http://tonphat.info/doc, nó sẽ vào /usr/share/doc.

Để giới hạn việc truy cập của người dùng ta có thể kết hợp với Directory directive.

Ví dụ:

Alias /blog /data/wordpress // trên thực tế chỉ cần cú pháp này là đủ bên dưới chỉ cần khi muốn thiết lập các tùy chọn cho directory

<Directory /data/wordpress>

AllowOverride None // tắt chức năng htaccess trong thư mục

Order allow,deny // thứ tự kiểm tra truy cập

Allow from all // cho phép truy cập từ mọi nơi có thể quy định lại bằng ip, dns, subnet

</Directory>

6. Chứng thực website

Ở đây ta đặt trường hợp rằng /blog của tôi là trang đang quá trình nâng cấp tôi muốn nó hoàn toàn private và chỉ có vài người được phép truy cập. Tức là ở đây cần có một dịch vụ chứng thực. Trong apache có 2 kiểu chứng thực:

Chứng thực thông thường (Basic)

Với kiểu này mật khẩu hoàn toàn không được mã hóa. Bạn sử dụng cú pháp alias như phần trên và thêm vài cú pháp khác như sau:

Alias /blog /data/wordpress”

<Directory /data/wordpress>

AuthType Basic #xác định kiểu chứng thực cơ bản

AuthName “Chung thuc Blog” # Tên cho quá trình chứng thực này sẽ xuất hiện trong ban thông báo

AuthUserFile /etc/httpd/conf/.htpasswd #đường dẫn đến tập tin lưu tài khoản user

Require user test1 #danh sách user cho phép truy cập, mỗi user thêm vào danh sách cách nhau một khoảng trắng

AllowOverride None

Order allow,deny

Allow from all

</Directory>

Tiếp theo là tạo user test tuy nhiên đây không là user hệ thống nên sẽ có cú pháp khác

#htpasswd –c /etc/httpd/conf/user test1

#htpasswd /etc/httpd/conf/user test2

Cú pháp trên tạo lần lượt 2 user với tham số -c chỉ cần ở lần đầu tiên khi file /etc/httpd/conf/user chưa được tạo

Nhớ restart dịch vụ httpd trước khi tiến hành kiểm chứng bằng cách vào địa chỉ http://<ip-domain>/blog. Một thông báo nhắc nhở yêu cầu chứng thực với test1 vào được test2 chứng thực không thành công

image

P/s: Một số trường hợp xảy ra lỗi chứng thực không thành công như sau

Bạn tạo user lặp lại tham số -c làm cho các user tạo trước đó bị mất

Cấu hình sai đường dẫn tập tin chứa thông tin người dùng trong httpd.conf

7. Cấu hình UserDir

Sẽ có lúc chúng ta có nhu cầu rằng mỗi user được tạo ra từ hệ thống, sẽ có một trang web của riêng mình. Ví dụ như nhân viên user1 sẽ có địa chỉ website cho riêng anh ấy là http://www.youcompany.com/~user1

Bây giờ chúng ta sẽ đi thực hành đều đó:

Đầu tiên, bạn khoan hãy tạo user, mà hãy đi tạo một thư mục www (tiện thì thêm sẵn một file index.html) trong thư mục /etc/skel Điều này sẽ làm cho mỗi user tạo ra sẽ có 1 thư mục nằm trong thư mục cá nhân /home/username Sau đó mới tạo user:

[root@server ~]# mkdir /etc/skel/www

[root@server ~]# useradd user1

[root@server ~]# passwd user1

Bây giờ chúng ta tiến sang cấu hình trong http.conf

Tìm dòng 355 đặt một dấu # đầu dòng, để bật chức năng UserDir

Dòng 362 bỏ dấu # đầu dòng nếu có và sửa thành là

UserDir www

www đây chính là thư mục chứ website cho mổi user

Dòng 370 tới 381 bỏ dấu # đi và sửa lại dòng 370 như sau:

<Directory /home/*/www>

AllowOverride All

Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec

<Limit GET POST OPTIONS>

Order allow,deny

Allow from all

</Limit>

<LimitExcept GET POST OPTIONS>

Order deny,allow

Deny from all

</LimitExcept>

</Directory>

Cuối cùng là restart dịch vụ và kiểm tra kết quả

Lỡ có load lên bị vụ permission nhớ chỉnh lại thư mục www thành 755

8. Điều khiển truy cập

Ngoài việc bảo mật nội dung của website bằng sự chứng thực (username và password), apache còn giới hạn việc truy cập của người dùng dựa trên những thông tin khác được  đề cập trong Access Control. Sử dụng directive Allow/Deny để cho phép/cấm việc truy cập tài nguyên dựa trên tên máy tính hoặc địa chỉ IP.

Allow/Deny Directive: Cú pháp khai báo Allow/Deny như sau

Allow/Deny from [address]

+  Allow có nghĩa cho phép các host/network/domain truy xuất vào Web server.
+  Deny có nghĩa cấm các host/network/domain truy xuất vào Web server.
+  address  là địa chỉ IP/địa chỉ đường mạng hay tên máy tính, tên miền.

Ví dụ:

Deny from 11.22.33.44
Deny from host.example.com
Deny from 192.101.205
Deny from exampleone.com example

Bạn sử dụng Order để kết hợp giữa Allow và Deny trong việc giới hạn việc truy cập:

Nếu thứ tự của Order là Deny, Allow thì Deny được kiểm tra trước tiên và bất kỳ những client nào không phù hợp với Deny hoặc phù hợp với một Allow thì được phép truy cập đến server.

Nếu thứ tự của Order là Allow, Deny thì Allow được kiểm tra trước và bất kỳ client nào không phù hợp với một điều kiện Allow hoặc phù hợp với một điều kiện Deny thì bị cấm truy cập đến server.

Ví dụ về một điều khiển truy cập ít giới hạn nhất.

<Directory “/usr/web”>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
Allow from all
</Directory>

Satisfy directive:

– Satisfy directive được dùng để chỉ ra nhiều tiêu chuẩn cần phải được xem xét trong việc bảo mật nội dung website. Satisfy có 2 giá trị là all và any. Mặc định, Satisfy nhận giá trị all, điều này có nghĩa là nếu nhiều tiêu chuẩn được chỉ ra thì tất cả những tiêu chuẩn này phải thoả mãn thì người dùng mới được phép truy cập tài nguyên. Còn giá trị any có nghĩa là một trong những tiêu chuẩn này hợp lệ thì user được phép truy cập đến tài nguyên.

– Một ứng dụng của việc sử dụng access control là giới hạn, những người dùng bên ngoài mạng khi truy cập tài nguyên cần phải có username và password còn tất cả những máy tính trong mạng thì không cần.

<Directory /usr/local/apache/htdocs/sekrit>
AuthType Basic
AuthName intranet
AuthUserFile /etc/httpd/conf/users
AuthGroupFile /etc/httpd/conf/groups
Require group customers
Allow from internal.com
Satisfy any
</Directory>

Posted on 02/04/2011, in Linux and tagged , , , , , , . Bookmark the permalink. 14 phản hồi.

  1. Chào bạn ! bạn cho mình hỏi chút là lệnh update cho phpmyadmin là
    :yum –y –enablerepo=Centos update php
    mình đánh đúng như vậy mà nó không thấy chạy gì hết.(Mình đã tạo cái file repo rồi)
    Nó báo lỗi như sau:
    [root@web ~]# yum y enablerepo=Centos update php
    Loaded plugins: fastestmirror
    usage: yum [options] COMMAND

    List of Commands:

    check-update Check for available package updates
    clean Remove cached data
    deplist List a package’s dependencies
    downgrade downgrade a package
    erase Remove a package or packages from your system
    groupinfo Display details about a package group
    groupinstall Install the packages in a group on your system
    grouplist List available package groups
    groupremove Remove the packages in a group from your system
    help Display a helpful usage message
    info Display details about a package or group of packages
    install Install a package or packages on your system
    list List a package or groups of packages
    localinstall Install a local RPM
    makecache Generate the metadata cache
    provides Find what package provides the given value
    reinstall reinstall a package
    repolist Display the configured software repositories
    resolvedep Determine which package provides the given dependency
    search Search package details for the given string
    shell Run an interactive yum shell
    update Update a package or packages on your system
    upgrade Update packages taking obsoletes into account

    options:
    -h, –help show this help message and exit
    -t, –tolerant be tolerant of errors
    -C run entirely from cache, don’t update cache
    -c [config file] config file location
    -R [minutes] maximum command wait time
    -d [debug level] debugging output level
    –showduplicates show duplicates, in repos, in list/search commands
    -e [error level] error output level
    -q, –quiet quiet operation
    -v, –verbose verbose operation
    -y answer yes for all questions
    –version show Yum version and exit
    –installroot=[path] set install root
    –enablerepo=[repo] enable one or more repositories (wildcards allowed)
    –disablerepo=[repo] disable one or more repositories (wildcards allowed)
    -x [package], –exclude=[package]
    exclude package(s) by name or glob
    –disableexcludes=[repo]
    disable exclude from main, for a repo or for
    everything
    –obsoletes enable obsoletes processing during updates
    –noplugins disable Yum plugins
    –nogpgcheck disable gpg signature checking
    –disableplugin=[plugin]
    disable plugins by name
    –enableplugin=[plugin]
    enable plugins by name
    –skip-broken skip packages with depsolving problems
    –color=COLOR control whether color is used

    Plugin Options:

    Mong bạn giúp đỡ .Thank bạn nhiều ^^

  2. ha ha ha ! sorry sorry bạn nha ! do mình gõ nhầm nên nó báo lỗi.Mình làm được rồi.Thank bạn rất nhiều

  3. chào bạn
    bạn có thể giúp mình giải quyết bài toán này được hông?
    trong file /var/www/html có :
    + file index.html
    + directory confidential, bên trong có file topsecret.html
    ( confidential/topsecret.html)
    – đối với trang web example.com/index.html thì all users trong htpasswd dc quyền truy cập (cái này mình biết cách làm)
    – đối với trang web example.com/confidential/topsecret.html thì chỉ có 1 group trong htgroup dc quyền truy cập (cái này mình chịu)

    pạn có thể giúp mình dc ko?
    thanks in advance!

  4. # cho phep all user trong htpasswd.db truy cập web lab.example.com/….

    Satisfy all
    Require valid-user

    authtype basic
    authname “lab.example.com, private zone”

    authbasicProivder file
    AuthUserFile “conf/auth/htpasswd.db”

    ServerName lab.example.com
    DocumentRoot “var/www/html”

    # vấn đề của mình là chỉ cho phép group privileged truy cập trang web nằm trong folder confidential với url là lab.example.com/confidential/…
    cái này mình viết theo hướng dẫn limit cho group nhưng thực sự ko làm việc…….hic
    các bạn giúp mình với!!!!

    Satisfy all
    Require group privileged

    authtype basic
    authname “lab.example.com, private zone”
    authbasicProivder file
    AuthUserFile “conf/auth/htpasswd.db”
    AuthGroupFile “conf/auth/htgroup.db”

    ServerName lab.example.com/confidential
    DocumentRoot “var/www/html/confidential”

    • Bạn thử xem đầu tiên là cho phép tất cả user có trong htpasswd truy cập webserver
      Directory /var/www/html
      AllowOverride AuthConfig
      AuthName “User authentication”
      AuthType Basic
      AuthUserFile /opt/.htpasswd
      require valid-user
      Directory

      Đối với thư mục secret thì áp dụng authen theo group

      < Directory /var/www/html/confidential
      AllowOverride AuthConfig
      AuthName "Secret Group authentication"
      AuthType Basic
      AuthUserFile /opt/.htpasswd
      AuthGroupFile /opt/.htgroup
      require group group-name
      Directory

      Sry trước là bên trên thằng wordpress ko cho viết dấu chỗ directory nhớ tự chỉnh
      Bạn thấy đc thì làm thử🙂

      • hic, minh lam thử mà vẫn hông dc😦 theo nguyên tắt thì nó đúng mà sao ko chạy…mình cũng ko biết nữa
        nhưng mà Thầy mình bảo fai viết dưới để còn add them cái ssl nữa….
        ban đầu mình viết dưới directory nhưng cũng ko chạy………hic

  5. Mình test cho bạn lun rồi đó theo đó tat cả user trong htpasswd được vào thu mục test chỉ user trong group Private được vào thư mục testgroup
    Directory /var/www/html/test
    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    Order allow,deny
    allow from all
    AuthType Basic
    AuthName “Restricted”
    AuthBasicProvider file
    AuthUserFile /opt/.htpasswd
    Require valid-user
    /Directory

    Directory /var/www/html/testgrp
    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    Order allow,deny
    allow from all
    AuthType Basic
    AuthName “Restricted”
    AuthBasicProvider file
    AuthUserFile /opt/.htpasswd
    AuthGroupFile /opt/.group
    Require group Private
    /Directory

    Nội dung file .htpasswd
    user:GAhfnosqnKH6Y
    user1:W/1jfZmqXG3LE
    user3:hFJpExfjn7uQg

    Nội dung file .group
    Private: user1 user2
    ## user3 không được vào trang testgrp

  6. thanks bạn “Tôn Phát” nhá!!!
    à, mình còn 1 vấn đề về cgi nữa, nếu bạn có time thì giúp mình với nhé. mình nêu ra ở đây luôn(^_^)

    mình cần tạo 1 file scripts tên counter, tính số lần truy cập vào chính scripts counter…mình đã chỉnh dc bên httpd.conf rồi (tức là dùng scriptalias: “/cgi-bin/ ” “/var/www/html”). rồi, nhưng mình ko biết viết gì vào vi counter hết:( ngoài 2 câu:
    #!/bin/bash
    echo ‘content-type: text/html’
    echo

    # bạn rãnh thì viết hộ tiếp mình nhá

    thanks a lot!!!

  7. mình đang thử cấu hình centos 5.6 giống với cách làm trên của bạn , nhưng khi cấu cài đặt xong thì htaccess không nhận được , mình thử một số cách nhưng nó vẫn đơ như cây cơ . cậu xem có giải quyết được jùm mình không .
    -Sau khi cài đặt bình thường , vào httpd.conf thêm đoạn này :

    AllowOverride All
    AllowOverride Options FileInfo AuthConfig Limit
    Order allow,deny
    Allow from all

    -Thêm 1 file htaccess có nội dung như sau :

    RewriteEngine on
    RewriteRule ^cat-(.*)/(.*)/page-(.*)$ index.php?cat=$1&n=$2&page=$3 [L]
    RewriteRule ^cat-(.*)/(.*)$ index.php?cat=$1&n=$2 [L]
    RewriteRule ^page-(.*)$ index.php?page=$1 [L]
    RewriteRule ^p-(.*)/(.*)$ index.php?p=$1&n=$2 [L]

    – kiểm tra lại mod_rewrite đã được chấp nhận .
    tớ cũng chỉ biết làm tới những bước đó nhưng nó vẫn cứ trơ ra , không hiểu sa0 , cậu xem thử

    • mình sưu tầm dc cách này pạn à🙂

      #!/bin/bash
      echo ‘content-type: text/html’
      echo

      COUNT=0
      [ -f /tmp/count ] && read COUNT /tmp/count

      echo “Count is $COUNT”

      exit 0

  8. Nguyễn mạnh hưng

    Chào bạn !!
    Bạn có thể giúp mình giải quyết 1 vấn đề mình đang vướng phải đc ko?
    Mình đã cấu hình theo bài hướng dẫn của bạn . Tất cả đều rất ổn định , Mình đã add db vào trong csdl nhưng ko hiểu sao khi chạy web trên localhost thì nó ko nhận đc database và cũng không nhận đựoc các trang con khác trên web của mình . Rất mong bạn giúp đỡ !!! Thanks for reading !!!

    • “chạy web trên localhost thì nó ko nhận đc database và cũng không nhận đựoc các trang con khác trên web của mình”
      @localhost ở đây ý là webserver đúng không
      @Vấn đề tương tác database thì bạn check bằng một số cách đơn giản sau: dùng command line tương tác với mysql (create,insert,select…), dùng phpmyadmin thao tác them xoa sửa csdl, check các hàm php dành cho mysql đã đủ chưa có thể xem qua phpinfo().
      @Nhận trang con ở đây là gì? webserver bạn multisite đúng không? và vướng cùng vấn đề là tương tác database

Gửi phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s

%d bloggers like this: