Tương tự như bài viết hướng dẫn add thêm website chạy trên VPS nginx CentOS, hôm nay mình sẽ hướng dẫn các bạn cách thực hiện trên webserver Apache.

Giới thiệu Virtual Hosts

Virtual Hosts được sử dụng để giúp cho một VPS có thể chạy được nhiều website khác nhau. 

Lưu ý: Việc thêm website như hướng dẫn chỉ áp dụng với hệ thống tự thiết lập hoàn toàn. Nếu bạn sử dụng các hệ quản trị như HocVPS Script, CentminMod, EasyEngine, VestaCP, Sentora, VPSSIM… thì add bằng menu của hệ quản trị đó để đảm bảo đầy đủ và tránh xung đột. Ví dụ, HocVPS bạn gõ lệnh hocvps trên SSH chọn menu 2) Them Domain

Các bước add thêm website trên VPS Apache chạy CentOS bằng Virtual Hosts như sau:

Chuẩn bị server

Đã cài đặt sẵn webserver Apache trên CentOS, có thể tham khảo bài viết cài đặt LAMP trên CentOS

Tạo thư mục chứa website

Ví dụ mình sẽ tạo thư mục ở folder /var/www nhé

sudo mkdir -p /var/www/example.com/public_html

Chú ý thay example.com bằng domain của bạn.

Gán quyền

Đảm bảo cho website hoạt động bình thường

sudo chown -R apache:apache /var/www/example.com/public_html

Ngoài ra chmod 755 để đảm bảo mọi người có thể xem được website của bạn

sudo chmod 755 /var/www

Cài đặt Virtual Hosts

Mình sẽ chỉnh sửa file cấu hình mặc định của Apache

sudo nano /etc/httpd/conf/httpd.conf

Thêm đoạn sau vào cuối file:

NameVirtualHost *:80
#
# NOTE: NameVirtualHost cannot be used without a port specifier
# (e.g. :80) if mod_ssl is being used, due to the nature of the
# SSL protocol.
#    

#    
# VirtualHost example:
# Almost any Apache directive may go into a VirtualHost container.
# The first VirtualHost section is used for requests without a known
# server name.
# 
<VirtualHost *:80>
     ServerAdmin webmaster@example.com
     DocumentRoot /var/www/example.com/public_html
     ServerName www.example.com
     ServerAlias example.com
     ErrorLog /var/www/example.com/error.log
     CustomLog /var/www/example.com/requests.log common
</VirtualHost>

Bạn cần chú ý các dòng NameVirtualHost, Virtual Host, Document Root, and Server Name để sửa lại cho phù hợp.

Lưu lại và thoát.

Khởi động lại Apache

Dừng tất cả tiến trình Apache

sudo apachectl -k stop

Khởi động Apache

sudo /etc/init.d/httpd start

Test thử domain

Giờ mình sẽ tạo thử file index.html để test thử domain example.com có hoạt động đúng không nhé.

sudo nano /var/www/example.com/public_html/index.html

Thêm đoạn code html vào file

<html>
  <head>
    <title>www.example.com</title>
  </head>
  <body>
    <h1>Success: You Have Set Up a Virtual Host</h1>
  </body>
</html>

Lưu và thoát.

Bây giờ bạn hãy test thử với link http://example.com, nếu kết quả hiện ra như bên dưới là thành công.

test thu example.com

Cài đặt thêm Virtual Hosts

Để add thêm nhiều website nữa, bạn có thể lặp đi lặp lại bước. Cấu trúc file config của Apache lúc nãy sẽ tương tự như sau:

<VirtualHost *:80>
     ServerAdmin webmaster@example.com
     DocumentRoot /var/www/example.com/public_html
     ServerName www.example.com
     ServerAlias example.com
     ErrorLog /etc/var/www/example.com/error.log
     CustomLog /var/www/example.com/requests.log common
</VirtualHost>
<VirtualHost *:80>
     ServerAdmin webmaster@example.org
     DocumentRoot /var/www/example.org/public_html
     ServerName www.example.org
     ServerAlias example.org
     ErrorLog /var/www/example.org/error.log
     CustomLog /var/www/example.org/requests.log common
</VirtualHost>

Khởi động lại Apache là tất cả các website sẽ hoạt động.

Comment của bạn

Lưu ý: tất cả comment đều được kiểm duyệt cẩn thận! Nếu có code bạn hãy up lên pastebin.com rồi để lại link trong comment.

118 Comments

  1. quang trung 6 comment

    Mình tạo 2 file .conf với nội dung như bên dưới, nhưng chỉ 1 site chạy được, site không load được. Bạn giúp mình với, cảm ơn

    Site 1
    NameVirtualHost *:80

    ServerAdmin webmaster@nhathuocvuongtron.com
    ServerName nhathuocvuongtron.com
    ServerAlias http://www.nhathuocvuongtron.com
    DocumentRoot /var/www/nhathuocvuongtron.com/public_html/
    ErrorLog /var/www/nhathuocvuongtron.com/logs/error.log
    CustomLog /var/www/nhathuocvuongtron.com/logs/access.log combined

    Site 2

    NameVirtualHost *:80

    ServerAdmin webmaster@biquyetvang.vn
    ServerName biquyetvang.vn
    ServerAlias http://www.biquyetvang.vn
    DocumentRoot /var/www/biquyetvang.vn/public_html/
    ErrorLog /var/www/biquyetvang.vn/logs/error.log
    CustomLog /var/www/biquyetvang.vn/logs/access.log combined

  2. Nghia 21 comment

    Ad cho mình hỏi trong bài viết trên, mục cuối “Cài đặt thêm Virtual Hosts”, mình thấy cả 2 web đều để port 80 luôn ah ???

      1. Nghia 21 comment

        Vậy nếu mình muốn chạy port khác thì sửa lại 80 thành 81 đúng không ?
        Có cần thêm 1 dòng NameVirtualHost *:81 nữa không bạn

        Cảm ơn

        1. Việt Phương Moderator

          uhm sửa 80 thành 81. Nhưng khi đó truy cập trên trình duyệt bạn cần nhập domain:81 nhé

  3. Hiệu 1 comment

    Cho hình hỏi cấu hình như vậy có cần phải cài đặt DNS trước không ạ!mình lần đầu tiên làm chưa hiểu lắm!

    1. Việt Phương Moderator

      Bạn vẫn cần trỏ domain về IP VPS trên quản lý DNS của Domain nhé

  4. Nghia 21 comment

    Cho mình hỏi mình tạo web 1 chạy OK rồi

    ServerAdmin aaa@gmail.com
    ServerName 10.210.254.205
    ServerAlias 10.210.254.205
    DocumentRoot /var/www/html/lichcongtac.vn/public_html
    ErrorLog /var/www/html/lichcongtac.vn/logs/error.log
    CustomLog /var/www/html/lichcongtac.vn/logs/access.log combined

    Nhưng sao Web 2 chạy không duoc

    ServerAdmin aaa@gmail.com
    ServerName 10.210.254.205
    ServerAlias http://10.210.254.205:81
    DocumentRoot /var/www/html/test.vn/public
    ErrorLog /var/www/html/test.vn/logs/error.log
    CustomLog /var/www/html/test.vn/logs/access.log combined

    Nhờ các anh xem giúp

    1. Việt Phương Moderator

      Bạn để servername giống như nhau thế kia thì nó không phân giải được để mà biết cái nào cái nào đâu bạn. Nếu bạn để port khác 80 thì bạn cần phải mở port nếu dùng firewall nữa

        1. Việt Phương Moderator

          1. Bạn restart Apache hiện thông báo gì? Với bạn set ServerAlias cũng không đúng
          2. Bạn đã trỏ test.vn về IP VPS chưa
          3. Thư mục /var/www/html/test.vn/public có phải thư mục website không

          1. Nghia 21 comment

            Chào bạn

            Mình restart Apache OK hết, mình chạy trên cùng 1 server có 1 IP đang chay local nên mình truy cập bằng IP luôn mà không chạy

            Cảm ơn bạn

  5. Nguyễn Linh 4 comment

    Mình cài control panel vestacp trên centos 6
    khi thêm website lúc chạy báo lỗi Internal Server Error
    là do lỗi gì vậy b

    1. Việt Phương Moderator

      Lỗi liên quan đến webserver. Bạn kiểm tra Apache và Nginx chạy ok không? Và bạn thêm bằng cách nào?

        1. Linh Nguyen 4 comment

          mình thêm code và import database bình thường trên quản trị vestacp

          1. Việt Phương Moderator

            Tức bạn thêm website bằng menu của VestaCP? Vì bạn đang cmt vào 1 topic không hề liên quan đến vestacp nên mình đã hỏi rõ ràng bạn thêm website bằng cách nào. Bạn check trạng thái của các services liên quan như mình bảo thôi, apache và nginx, đọc thêm bài các câu lệnh Linux thông thường…

  6. đức 31 comment

    cho e hỏi lúc làm lệnh này sudo mkdir -p /var/www/example.com/public_html

    mà thành công thì nó có báo gì ko ạ?e làm xong thì nó chỉ xuống dòng thôi

    nếu thành công nó có tạo folder trong public_html ko ạ? e làm xong ko thấy 🙁

    1. Việt Phương Moderator

      Thì nó sẽ tạo thư mục như bạn bảo /var/www/example.com/public_html Không thông báo gì bạn nhé

    1. Việt Phương Moderator

      Bạn thêm domain thứ 2 vào bên cạnh domain chính ở dòng ServerAlias
      Ví dụ ServerAlias domain1.com domain2.com

  7. Mr.K 3 comment

    Anh Luân ơi cho em hỏi : Em đã làm theo các bước ở đây rồi. Nhưng domain t2 chỉ thay được cho domain t1 ở trang chủ thôi. Khi dùng domain t2 vào trang con thì nó nhảy ra domain t1. Vậy em phải làm sao để domain t2 chạy độc lập như 1 site bình thường ạ.

    1. Việt Phương Moderator

      Phần Cài đặt thêm Virtual Hosts, bạn tạo các file Vhost riêng cho từng website chứ?

      1. Mr.K 3 comment

        Ý em là add thêm nhiều domain cho 1 website đó anh. cùng 1 database luôn đó ạ.

        1. Việt Phương Moderator

          Nếu thế bạn xem Park Domain nhé, không phải trường hợp thêm website như bạn mô tả đâu.
          Park Domain dùng để nhiều domain hiển thị cùng 1 website(database)

    1. Việt Phương Moderator

      Url chính là website em/optimus đó. Nội dung trong domain/public_html truy cập qua web bằng domain nhé.
      Ví dụ website anh là hocvps.com. Anh up thư mục A lên /home/hocvps.com/public_html/ thì truy cập qua web bằng hocvps.com/A.

  8. mynuke 2 comment

    Hi bạn, theo cript này mình muốn thực thi để quản lý domain bằng php script, thêm sửa xóa bằng PHP, có cách nào không bạn nhỉ?

    1. Việt Phương Moderator

      Script không hỗ trợ sẵn vấn đề này rồi bạn à. Bạn thử các hệ quản trị khác như VestaCP, Sentora xem

  9. Đinh Quốc Toản 2 comment

    Bạn ơi cho mình hỏi.
    Khi mình chạy thì các file .php bị lỗi “Internal Server Error” còn nếu là các file html thì vẫn chạy được bình thường.
    Lỗi đó là do đâu bạn nhỉ? Do mình phân quyền sai hay như thế nào vậy bạn

    1. Việt Phương Moderator

      Bạn mô tả hệ thống cài đặt của bạn và lỗi, cũng như check error log chứ hiện tại chung chung quá mình chưa hiểu

      1. Toản 2 comment

        Cảm ơn bạn đã trả lời nhé.
        Hôm đó mình up file php lên server, để owner là nobody nhưng group vẫn là root nên không được. Mình đổi cả lại group cũng là nobody thì đã hoạt động được rồi.
        Cảm ơn các bạn đã nhiệt tình hỗ trợ :))

  10. Thái Đức Khánh 8 comment

    Mình cài Hocvps scrip, dùng lệnh thêm website và đã thêm thành công, nhưng sao vào filemanager thì lại k thấy folder của domain đó mà chỉ thấy 1 folder mới tên là false (chắc bị lỗi) nhỉ

    1. Luân Trần Admin

      Bị lỗi gì đó rồi, gửi mình thông tin login SSH vào mail để mình check được không?

      1. Thái Đức Khánh 8 comment

        Chào anh, em đã add được domain mới rồi ạ. Nhưng hiện cái domain mới đó k dẫn về site mới (site mà mình up lên folder của domain đó) mà nó lại dẫn về main domain của VPS. không biết là lỗi gì ạ?

      2. Thái Đức Khánh 8 comment

        Mình add được rồi bạn ạ nhưng k hiểu sao cái domain mình mới add nó k load dữ liệu từ folder của domain đó mà nó cứ tự động chuyển hướng về main-domain của VPS nhỉ?

        1. Luân Trần Admin

          Nếu không check cụ thể được thì mình cũng không biết nguyên nhân ở đâu nữa

      1. van minh 44 comment

        Mình cài vectacp có sẵn home/admin/web rồi, mình trỏ về web về đây thay vì var/www/example.com/public_html/index.html được không bác.

        1. Dinh Le Giang 51 comment

          Ý bác này nói cái thư mục chứa web mặc định của vestacp là /home/user/
          Giờ muốn cài web ở thư mục /var/ww có được không.
          Mình thì nghĩ là được, chỉ cần cấu hình lại file vhost hoặc file nginx

          1. van minh 44 comment

            Đúng rồi bạn mà mình đã thêm Virtual Hosts vào vhost trỏ tới thư mục chứa source.

            Đã thêm DB, Domain, DNS trong VectaCP và cấu hình kết nối DB trên Source. nhưng khi truy cập vào web vẫn bị thông báo “500 Internal Server Error”. Không biết sao luôn

          1. Dinh Le Giang 51 comment

            Xét kỹ hơn xíu thì thế này:
            Lúc cài xong chưa có web thì Sentora ít tốn tài nguyên hơn Vestacp
            Nhưng lúc có web thì ngược lại, vì vesta sử dụng webserver nginx, tốc độ xử lý nhanh hơn, nên tiết kiệm được tài nguyên.

            Nói vậy chứ mình vẫn thích giao diện của Vesta như bạn. Hiện tại mình đang xài Sentora.
            Mình có 3 giao diện: Zentora, Cpanel x3, DirectAdmin

  11. Ngọc Tú 1 comment

    Luân cho mình hỏi mình cài 2 web trên cùng 1 vps chạy hocvps. khi creat user và databas thì 2 site chạy cùng 1 cái hay là mình phải tạo thêm 1 user nữa. làm sao để phân biệt rõ ràng được 2 cái user cho từng site vậy bạn? không hiểu sao mình thêm 1 web vào mà cái thứ 2 nó cứ bị lỗi 400 Bad Request

    1. Luân Trần Admin

      Mỗi một user tương ứng với 1 database. 2 site riêng thì 2 database, 2 user nhé bạn.

    1. Luân Trần Admin

      HocVPS Script không dùng Apache mà cài Nginx nên không có thư mục kia nhé bạn

  12. Triều 1 comment

    Cho mình hỏi là mình mua VPS tại nhân hoàn , họ cài sẵn apache, mysql.. và Driect Admin. Giờ muốn thêm domain thì làm theo cách này à bạn, với muốn cài cái hocvps script thì có cần phải rebuild lại vps hay không

    1. Luân Trần Admin

      Nếu cài Direct Admin rồi thì mọi thao tác bạn thực hiện trên đó nhé. Muốn cài HocVPS Script thì phải rebuild lại VPS.

    1. Luân Trần Admin

      Nếu cài HocVPS Script rồi thì không cần mày mò theo cách này làm gì, bạn chỉ cần chạy menu hocvps rồi chọn Thêm website là được.

      1. Thiện 29 comment

        mình chạy lệnh thêm website trước rồi
        nó có thêm website
        mình trỏ domain về nhưng không chạy !
        báo không có trang này !

        1. Luân Trần Admin

          Domain của bạn là gì để mình check. Có thể domain chưa nhận IP đó bạn.

          1. Thiện 29 comment

            đã làm được rồi Luân ơi
            mình xóa VPS cento đi
            cài bản Cento 7 vào rồi cài lại
            tên miền thứ 2 mình trỏ theo dạng IP mới nhận

  13. trần chí thiện 1 comment

    cái này mình phải thuê hoặc mua một host và domain với cài được hay sao ạ

  14. bui 24 comment

    Mình đã làm đủ các bước nhưng khi test doamin nó vẫn ra nguyên cái nội dung của file index

    domain

    Success: You Have Set Up a Virtual Host

    Mình thêm web vô /home/domain/public_html

    Thanks

  15. bui 24 comment

    Mình cung không cần phải chỉnh sửa gì trông file httpd.conf luôn ha bạn.

    Thanks

  16. bui 24 comment

    Cho mình hỏi chút nếu mình chỉ dùng 1 domian duy nhất có cần làm như các bước ở trên không bạn.

    Và nếu mình không làm các bước như trên thì add 1 domian vô như thế nào ?

    Cảm ơn.

    1. Luân Trần Admin

      Nếu chỉ dùng 1 domain thì ko cần làm các bước như trên. Mặc định domain đó sẽ nhận đường dẫn là /var/www/ (ko nhớ có đúng ko nữa 🙂 )

  17. huy 2 comment

    có ai rành triển khai nhiều web wp trên 1 vps không… giúp minh với…. mình newbie chưa hiểu rõ lắm…. xin cảm ơn

    1. Luân Trần Admin

      Bạn có thể cài đặt HocVPS Script, mỗi web add domain mới rồi upload lên folder tương ứng.

  18. Long Tu 5 comment

    login bằng SSH thì cái đoạn mã vào cuối file bằng cách nào vậy bạn? trên SSH ko thấy có chỗ để edit file 🙁

  19. cong 5 comment

    cho mình hỏi là sau khi tạo xong rồi, mình đặt 1 domain chạy joomla, 1 domain chạy wordpress được chứ Luân?

    Mình là dân ko chuyên chỉ biết copy cài đặt thôi 😀

  20. Hải Nam 1 comment

    anh Luân ơi, sao em tạo VirtualHost mà khi truy cập vào website nó chỉ chạy trang apache mà không chạy qua trang index.html nhỉ…. mấy bữa rồi mà vẫn chưa khắc phục được. không hiểu tại sao. a giúp e với. híc

    1. dao hung 18 comment

      Kinh nghiệm xương máu: tên hostname của server trùng với domain nên khi có request nó tự nhận diện domain là chính nó nên chuyển về thư mục /var/www/html

      bạn sửa file /etc/hostname rồi chạy lệnh
      hostname -F /etc/hostname
      là được

  21. Nhat 12 comment

    Mình fai thêm # ở: ErrorLog /var/www/example.org/error.log
    CustomLog /var/www/example.org/requests.log common
    2 dòng này nó mới ko lỗi khi restart apache và cài thành công Virutualhost nỉ?
    Tiện đây cho mh hỏi? Mh muốn tạo subdomain trên goddady thì tạo thêm cái gì trên DNS Zone vậy b? và thiết lập cấu hình ở Apache thì làm sao để nó chạy + lấy dữ liệu riêng biệt cho sub.domain.com mà ko chạy trùng dữ liệu vs domain.com.. Vì mh có làm vài lần gõ sub.domain.com cũng như domain.com !!
    thanks bác!

    1. Luân Trần Admin

      Bạn cần tạo thêm một A Record subdomain trỏ đến IP hosting là xong, lúc này subdomain sẽ coi như domain riêng biệt.

      1. nhat 12 comment

        Cho e hỏi câu nữa,chỗ đoạn: nano /etc/httpd/conf/httpd.conf sửa file này thì cứ để nguyên nội dung cả file httpd.conf chỉ thêm mỗi đoạn kia của bác thui à? e cũng từng làm mấy kiểu mà gõ sub.domain.com nó cũng ra như domain.com là tn nỉ?
        thanks bác?

        1. Luân Trần Admin

          Đúng rồi bác, làm như đoạn Cài đặt thêm Virtual Hosts ấy.

          Redirect bac check lại vấn đề DNS và cache nữa nhé.

    1. Luân Trần Admin

      Cái bạn hỏi là Directory Listing, chèn đoạn sau vào file .htaccess là được: Options +Indexes

  22. Trung Tran 24 comment

    Mình gặp phải lỗi này:
    Warning: DocumentRoot [/etc/httpd/var/www/winmain.vn/public_html] does not exist
    httpd (no pid file) not running

  23. Tit 5 comment

    Bác Luân cho e hỏi là làm theo cách này khi create user thì làm sao để cho nó hiểu user 1 trỏ về thư mục của domain 1, user 2 trỏ về thư mục domain 2 vậy?

  24. John A Vu 1 comment

    Mình làm đến đoạn sudo apachectl -k stop nó báo là “httpd could not reliably determine the server’s fully qualified domain name ” là sao nhỉ

    1. Luân Trần Admin

      Cái này do chưa setup hostname cẩn thận thôi. Nhưng mà ko sao đâu bạn, chạy bình thường.

  25. Hoang 39 comment

    Cho mình hỏi chút.
    Khi mình cài xong tất cả các dịch vụ. Tất cả dịch vụ đều chạy tốt kể cả các file trong folder var/www/html
    Nhưng website trả về 1 trang trắng là sao bạn nhỉ và cũng ko debug dc. 🙁

    1. Hoàng 39 comment

      Đã giải quyết xong cái này 😀

      Mình sử dụng xml mà chưa cài thư viện php-xml

  26. Du 4 comment

    Cái này hay.Em đang cần đây. Cho đỡ tốn $. Nhưng chắc là ảnh hưởng đến tốc độ của site bác nhỉ

    1. Luân Trần Admin

      Tất nhiên là sẽ ảnh hưởng rồi. Trước chỉ phục vụ 1 em, giờ phải phục vụ thêm 1 em nữa, nếu server tài nguyên đủ lớn thì mới chơi được.