Thông thường mỗi VPS mình chỉ chạy cho một website mà thôi, tuy nhiên trong trường hợp bạn có nhiều website và muốn add thêm chạy trên VPS thì sao, hãy tham khảo bài hướng dẫn này để thực hiện.

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

Theo như nginx website, Virtual Hosts được gọi là Server Blocks trên nginx, tuy nhiên cho dễ dàng giống như Apache nên mình sẽ gọi là Virtual Hosts trong bài này. Các bước add thêm website trên VPS nginx chạy CentOS bằng Virtual Hosts như sau:

Chuẩn bị server

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

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

Ví dụ mình sẽ tạo thư mục ở folder /home/ nhé. Thay example.com bằng domain của bạn.

mkdir -p /home/example.com/public_html

Gán quyền

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

chown -R nginx:nginx /home/example.com/public_html

Cài đặt Virtual Hosts

Thêm file cấu hình .conf cho domain mới

nano /etc/nginx/conf.d/example.com.conf

Sử dụng đoạn code sau:

#
# example.com configuration
#
server {
    listen       80;
    server_name example.com;

    location / {
        root   /home/example.com/public_html;
        index index.php  index.html index.htm;
        try_files $uri $uri/ /index.php?q=$uri&$args;
    }

    error_page  404              /404.html;
    location = /404.html {
        root   /home/example.com/public_html;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /home/example.com/public_html;
    }

    # pass the PHP scripts to FastCGI server
    #
    location ~ \.php$ {
        root           /home/example.com/public_html;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME   $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}

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

Reload Nginx

service nginx reload

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é.

nano /home/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 trên

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

Comment của bạn

Your email address will not be published. Required fields are marked *

178 Comments

  1. Thucle Blog 2 comment

    Chào Hocvps, Mình có dùng script của bên bạn cài cho vps lúc cấu hình mình chọn domain chính lúc cài là A nhưng khi thêm domain sử dụng công cụ số 2 ( domain B) như bài đề cập thì truy cập vào domain B nó điều hướng về domain B mình có thử tạo thêm một domain khác nhưng vẫn bị tình trạng này. Mong được hỗ trợ

  2. Anh Tuan 2 comment

    Đây là code cua file domain ạ
    #
    # dangtest.com configuration
    #
    server {
    listen 80;
    server_name 192.168.1.101 dangtest.com;

    location / {
    root /home/dangtest.com/public_html;
    index info.php index.html index.htm;
    try_files $uri $uri/ /info.php?q=$uri&$args;
    }

    error_page 404 /404.html;
    location = /404.html {
    root /home/dangtest.com/public_html;
    }

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    root /home/dangtest.com/public_html;
    }

    # pass the PHP scripts to FastCGI server
    #
    location ~ \.php$ {
    root /home/dangtest.com/public_html;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index info.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
    }
    }

  3. Anh Tuan 2 comment

    Ad vui lòng cho em hỏi em đã làm theo các bước trên, nhưng server không hiển thị, tuy nhiên khi xóa bỏ file đi chạy file thì bình thường

    Em xin chân thành cảm ơn !!

  4. Phúc 2 comment

    Hello admin! 🙂

    I have bought new IP from OVH, I have installed and the site worked quite well on “non-www” version, I’d like to use “www” version so I changed in the “general setting” to “www.domain.com”, after that, I could not log in wp dashboard, I did try to redirect www to non-www by adding this

    “server {
    server_name http://www.example.com;
    return 301 $scheme://example.com$request_uri;
    }

    to /etc/nginx/conf.d/redirect.conf

    But I still can not log in until now, can you please help me out?
    Many thanks 🙂

    1. Việt Phương Moderator

      Để đổi từ non-www sang www bạn cần thay đổi cả ở Nginx Conf và trong wp-admin của site. Nginx Conf thì bạn sửa phần quy định website chứ không tạo riêng 1 redirect.conf như vậy. Bạn kiểm tra file conf nào trong /etc/nginx/conf.d/ quy định website thì sửa nhé
      Trong wp-admin thì cần phải quét toàn bộ URL để thay đổi

      1. Phúc 2 comment

        Hi, cám ơn bạn nhé, mình xóa database và site rồi add lại dạng có www với hocvps là đc rồi, hihihi, thanks ad

  5. giang 3 comment

    Mình thêm đc website rồi.
    giờ trỏ 1 subdomain từ cloudflare.com về website mới này như nào vậy các bác nhỉ ?

  6. DOAN VAN HUONG 8 comment

    mình có cái hocvps. sau khi thêm website phụ nữa vào. sau đó xóa đi thì bây giờ gõ địa chỉ ip của vps lên trình duyệt nó lại tự động trỏ vào website phụ.
    giờ em muốn thay đổi để nó tự động vào website chính thì làm thế nào ạ?

    1. Việt Phương Moderator

      nginx -t của bạn ra kết quả gì?
      Và bạn chú ý phần lưu ý trong bài viết nhé. Thêm website bằng menu của hocvps

      1. DOAN VAN HUONG 8 comment

        [root@moncup home]# nginx -t
        nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
        nginx: configuration file /etc/nginx/nginx.conf test is successful
        của em ra thế này ạ.

  7. Tiểu Cường 3 comment

    E làm các bước như a xong
    [root@cuonglm home]# curl -i datlm.com
    HTTP/1.1 302 Moved Temporarily
    Server: nginx/1.4.6 (Ubuntu)
    Date: Thu, 11 Oct 2018 10:28:54 GMT
    Content-Type: text/html
    Transfer-Encoding: chunked
    X-Powered-By: PHP/5.5.9-1ubuntu4.25
    Set-Cookie: PHPSESSID=v0q69llref7saam96v3s0o6311; path=/
    Expires: Thu, 19 Nov 1981 08:52:00 GMT
    Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
    Pragma: no-cache
    Location: https://com.com
    X-XYZ-LBX: LND
    X-XYZ-SRV: web3
    Set-Cookie: SRVNAME=web3; path=/
    A có thể fix cho e k ạ?

      1. Tiểu Cường 3 comment

        [root@cuonglm public_html]# curl -I datlm.com
        HTTP/1.1 403 Forbidden
        Server: nginx/1.14.0
        Date: Fri, 12 Oct 2018 03:54:05 GMT
        Content-Type: text/html
        Content-Length: 169
        Connection: keep-alive

        Minh tro dung roi.gio n lai loi nay la sao a

  8. Thanh Pham 1 comment

    Cảm ơn bạn!
    Cho mình hỏi chút: Mình thực hiện tác bước như trên và trong nội dung file .conf chỗ nào ví dụ của bạn là example.com mình thay bằng domain của mình, thay đổi IP . Nhưng không hiểu sao khi mình test thử thì tên miền lại chạy về nội dung web 1 của mình. Bạn có thể giải thích giúp mình lỗi và cách sửa không?

    1. Việt Phương Moderator

      1. Fix lỗi thì cho mình kết quả của nginx -t
      2. Hệ thống bạn là gì? Vì nếu dùng stack script thì tạo website có menu rồi. Hướng dẫn này chỉ áp dụng cho hệ thống tự cài đặt hoàn toàn thôi

      1. Tiểu Cường 3 comment

        vì bạn trỏ về cùng 1 root
        mình cx đang mắc chỗ đó.mình thử trỏ root ra 1 thư mục khác và phân quyền.nhưng k được @@ T.T

        1. Việt Phương Moderator

          Mình không hiểu ý bạn. Nên tốt nhất bạn post toàn bộ nội dung Nginx Conf bạn đã thiết lập ra nhé

  9. Loc 1 comment

    Mình cài VPS Vultr Window 7 Pro. Dùng Appserv 8.6, PHP 7.1 và Apache Web Server Version 2.4.25
    KHông hiểu sao mình thêm domain vô nó cứ hiện ở folder WWW không, dù mình đã set thông số
    DocumentRoot là một folder domain con, hình như thông số đó không có tác dụng. Vì mình tính thêm nhiều domain vào cái server đó.
    Admin biết là nó bị gì không, chỉ mình với

    1. Việt Phương Moderator

      Mình không dùng hệ thống Apache trên Windows OS nên không rõ rồi. Có thể bạn edit sai file hoặc file bạn edit là AutoGenerate, bạn cần chỉnh sửa chỗ khác

  10. Thái Nguyễn 1 comment

    Cho em hỏi cách fix lỗi này với ạ:

    [root@HomedyVPS2 ~]# service nginx status
    Redirecting to /bin/systemctl status nginx.service
    ● nginx.service – nginx – high performance web server
    Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
    Active: failed (Result: exit-code) since Wed 2018-05-16 16:50:11 +07; 24min ago
    Docs: http://nginx.org/en/docs/
    Process: 25036 ExecStop=/bin/kill -s TERM $MAINPID (code=exited, status=0/SUCCESS)
    Process: 3087 ExecReload=/bin/kill -s HUP $MAINPID (code=exited, status=0/SUCCESS)
    Process: 25039 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=1/FAILURE)
    Main PID: 3057 (code=exited, status=0/SUCCESS)

    May 16 16:50:11 HomedyVPS2 systemd[1]: Starting nginx – high performance web server…
    May 16 16:50:11 HomedyVPS2 nginx[25039]: nginx: [emerg] open() “/home/adlite.net/logs/access.log” failed (2: No such file or directory)
    May 16 16:50:11 HomedyVPS2 systemd[1]: nginx.service: control process exited, code=exited status=1
    May 16 16:50:11 HomedyVPS2 systemd[1]: Failed to start nginx – high performance web server.
    May 16 16:50:11 HomedyVPS2 systemd[1]: Unit nginx.service entered failed state.
    May 16 16:50:11 HomedyVPS2 systemd[1]: nginx.service failed.
    May 16 17:10:31 HomedyVPS2 systemd[1]: Unit nginx.service cannot be reloaded because it is inactive.
    May 16 17:10:46 HomedyVPS2 systemd[1]: Unit nginx.service cannot be reloaded because it is inactive.

    1. Việt Phương Moderator

      nginx: [emerg] open() “/home/adlite.net/logs/access.log” failed (2: No such file or directory)
      Không tồn tại /home/adlite.net/logs/access.log nhé bạn. Có 2 cách
      1. Tạo file ý và phân quyền ghi cho webserver.
      2. Xóa dòng quy định accesslog trong cấu hình Nginx đi

  11. Akiyoshi 1 comment

    Cảm ơn HocVPS Script nhiều nha .
    Hiện mình đang dùng HocVPS Script và thêm 2) Them Domain , mình thấy rất hay nhưng khi thêm subdomain thì mình phải cấu hình nano /etc/nginx/conf.d/example.com.conf thì mới chạy được .
    cấu hình của mình như dưới .
    #
    # subdomain configuration
    #
    server {
    listen 80;
    server_name subdomain.example.com;

    location / {
    root /home/subdomain/public_html;
    index index.php index.html index.htm;
    try_files $uri $uri/ /index.php?q=$uri&$args;
    }

    error_page 404 /404.html;
    location = /404.html {
    root /home/subdomain/public_html;
    }

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    root /home/subdomain/public_html;
    }

    # pass the PHP scripts to FastCGI server
    #
    location ~ \.php$ {
    root /home/subdomain/public_html;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
    }
    }

    1. Việt Phương Moderator

      Cấu hình như bạn thì dùng hocvps menu2) Them Domain và nhập là được mà. Bạn nhập domain hay subdomain đều được
      Vì bản chất subdomain của bạn là 1 website độc lập, có thư mục source code riêng
      root /home/subdomain/public_html;

  12. long 45 comment

    Mình add thêm sub domain. trong godaddy không cần trỏ gì vẫn được hả… sao mình mới gõ thêm subdomain thôi nó đã chạy luôn rồi ạ!

    1. Việt Phương Moderator

      Có khả năng trong GoDaddy bạn đã tạo wildcard subdomain, bao hàm toàn bộ các subdomain.

      1. long 45 comment

        hiện mình có 2 domain. nhưng domain chính của mình đã được bán.. giờ mình không thể vào được domain.com:port để upload mysql.. giờ mình muốn chuyển domain phụ thành domain chính để vô được phpmyadmin thi làm sao ạ….
        mình xem hướng dẫn đổi domain.com.conf nhưng không được ạ

        1. Việt Phương Moderator

          Bạn truy cập qua ip:port cũng được mà. Đổi thì bạn phải đổi server_name của conf

          1. long 45 comment

            mình truy cập ip:port nó tự redirect qua tên miền chính luôn… mình đổi server_name trong file conf thành domain phụ mà vẫn không được ạ.. giờ không biết sao để vô SQL

          2. Việt Phương Moderator

            Bạn post toàn bộ Nginx Conf trong /etc/nginx/conf.d/ ra đây mình xem. Cho mình cả nội dung của /etc/hocvps/scripts.conf
            Paste vào http://pastebin.com/ cho gọn nhé bạn

  13. hong vi 45 comment

    Mình cài được rồi cho mình hỏi. quản lý filemanager với phpmyadmin ở đâu… mình vô domainmoi.com:1111/filemanager thì nó lại ra trang củ

    1. Việt Phương Moderator

      File Manager quản lý chung toàn bộ các website, không riêng gì website nào cả bạn nhé
      PHPMyAdmin quản lý theo database, không riêng theo website nốt

  14. hong vi 45 comment

    Hiện tại mình cài 1 website thôi.. nhưng sao chiếm nhiều ram dữ vậy nhỉ.. giờ mình muốn thêm vài website nữa Vps này có được không. VPS 140k/ tháng. Ai có hướng dẫn thêm domain vô vps cho mình xin luôn https://i.imgur.com/Rgsd8DR.jpg

    1. Việt Phương Moderator

      HocVPs thì bạn dùng menu hocvps 2 Them Website
      Mà sao 140k/tháng đc có VPS 500MB RAM vậy. Duy trì các service mặc định cũng ngốn kha khá rồi. Và đo lương không theo website được đâu. Website 10k visit nó khác với 10 visit chứ. Nên bạn cứ thêm xem sao, không ổn thì nâng cấp

      1. hong vi 45 comment

        oke ad.. Mà ad ơi, mình có cần cài thêm wordpress cho website thứ 2 không… trước thấy có bài nào nói hình như không cần cài thêm, nặng mà ạ