BÀI 2: TRIỂN KHAI VÀ QUẢN TRỊ WEB SERVER (IIS & LINUX STACK)

2.1. Quản trị Web Server trên Windows (IIS). 

2.1.1. Lý thuyết cơ bản về IIS

Internet Information Services (IIS) là máy chủ web do Microsoft phát triển, tích hợp sẵn trong Windows Server.

  • Application Pools (Nhóm ứng dụng): Là tính năng cô lập các ứng dụng web. Mỗi Website nên được đưa vào một Application Pool riêng. Nếu Website A bị lỗi (Crash) hoặc bị tấn công, nó sẽ chỉ làm hỏng Application Pool của Website A, Website B vẫn hoạt động bình thường.

  • Bindings (Tên miền liên kết): Máy chủ thường chỉ có 1 địa chỉ IP và 1 cổng HTTP (Port 80). Để chạy nhiều website (ví dụ: web1.com, web2.com), ta điền tên miền vào ô Host name khi tạo web. IIS sẽ đọc gói tin HTTP Header để trả về đúng thư mục của web đó.

  • Virtual Directory (Thư mục ảo): Ánh xạ (map) một URL web tới một thư mục vật lý nằm ngoài thư mục gốc của website.

2.1.2. THỰC HÀNH: Triển khai Website với IIS. Thực hành trên máy ảo

Tình huống: Tạo một website có tên miền là tintuc.local chạy trên máy chủ Windows Server.

Bước 1: Cài đặt dịch vụ Web Server (IIS)

    1. Mở ứng dụng Server Manager.

    2. Click chọn Add roles and features. Bấm Next liên tục cho đến phần Server Roles.

    3. Trong danh sách Roles, tích chọn ô Web Server (IIS). Một bảng thông báo hiện ra, bấm Add Features.

    4. Bấm Next liên tục đến cuối và bấm Install. Đợi cài đặt xong, bấm Close.

Bước 2: Chuẩn bị thư mục chứa mã nguồn Website

    1. Mở File Explorer, truy cập vào ổ C:\inetpub\wwwroot (thư mục gốc mặc định của IIS).

    2. Tạo một thư mục mới tên là tintuc_web.

    3. Mở thư mục tintuc_web, tạo file index.html.

    4. Mở file index.html bằng Notepad, gõ dòng chữ: <h1>Chao mung den voi trang Tin tuc</h1>, lưu lại.

Bước 3: Tạo Website trên IIS (Cấu hình Bindings)

    1. Mở phần mềm Internet Information Services (IIS) Manager.

    2. Ở cột trái, click chuột phải vào thư mục Sites -> Chọn Add Website…

    3. Điền thông số:

      • Site name: TinTuc

      • Physical path: Trỏ đến C:\inetpub\wwwroot\tintuc_web.

      • Host name: tintuc.local (Kỹ thuật Bindings).

    4. Bấm OK.

Bước 4: Chỉnh sửa file Hosts để kiểm tra (Giả lập DNS)

    1. Mở Notepad dưới quyền quản trị (Run as administrator).

    2. Mở file theo đường dẫn: C:\Windows\System32\drivers\etc\hosts.

    3. Thêm dòng sau vào cuối file: 127.0.0.1 tintuc.local

    4. Lưu file. Mở trình duyệt web gõ http://tintuc.local để xem kết quả.

Hướng dẫn chi tiết từng bước để Test (Kiểm tra) Website IIS chạy trên Máy ảo (Virtual Machine) từ Máy thật (Host PC).

Trong kịch bản này, Máy ảo (đang chạy Windows Server) sẽ đóng vai trò là Máy chủ (Server), còn Máy tính thật của học sinh (đang chạy Windows 10/11) sẽ đóng vai trò là Máy khách (Client).

BƯỚC 1: Đảm bảo Máy ảo và Máy thật có thể “nhìn thấy” nhau

Trước khi test, bạn cần chắc chắn phần mềm ảo hóa (VMware hoặc VirtualBox) đã được cấu hình card mạng đúng cách.

  1. Trên phần mềm ảo hóa, vào phần cài đặt mạng (Network Adapter) của máy ảo Windows Server.

  2. Chọn chế độ NAT (khuyên dùng) hoặc Bridged hoặc Host-only.

  3. Khởi động máy ảo lên.

BƯỚC 2: Lấy địa chỉ IP của Máy ảo (Web Server)

  1. Bên trong Máy ảo Windows Server, nhấn tổ hợp phím Windows + R, gõ cmd và nhấn Enter.

  2. Trong cửa sổ màu đen, gõ lệnh ipconfig và nhấn Enter.

  3. Ghi lại địa chỉ IPv4 Address của máy ảo. (Ví dụ: 192.168.100.10).

BƯỚC 3: Mở Port tường lửa trên Máy ảo (Bước rất hay quên)

Mặc định Windows Server có thể bật Firewall chặn các truy cập từ bên ngoài vào. Bạn cần mở cổng 80 (HTTP) để máy thật có thể truy cập Web.

  1. Bên trong Máy ảo, mở Windows Defender Firewall with Advanced Security.

  2. Chọn Inbound Rules (Luật kết nối đến) -> Ở cột bên phải chọn New Rule…

  3. Chọn Port -> Next.

  4. Chọn TCP và mục Specific local ports80 -> Next.

  5. Chọn Allow the connection -> Next liên tục, đặt tên cho Rule này là Open Port 80 Web IIS -> Finish.

BƯỚC 4: Ping kiểm tra kết nối từ Máy thật (Client)

  1. Thu nhỏ máy ảo lại, quay trở về giao diện Windows của Máy thật.

  2. Trên máy thật, mở cmd (Windows + R -> cmd).

  3. Gõ lệnh: ping 192.168.100.10 (Thay bằng IP bạn đã lấy ở Bước 2).

    • Nếu kết quả báo Reply from…: 2 máy đã thông mạng.

    • Nếu báo Request timed out: Bạn cần kiểm tra lại card mạng của máy ảo hoặc tắt tạm Firewall trên máy ảo.

BƯỚC 5: Cấu hình file hosts trên Máy thật

Vì tên miền giả định (ví dụ: tintuc.local) không tồn tại trên Internet, bạn phải “dạy” cho máy thật biết rằng tên miền này trỏ về IP của máy ảo.

  1. Trên Máy thật, bấm nút Start, gõ Notepad.

  2. Click chuột phải vào biểu tượng Notepad, chọn Run as administrator (Bắt buộc chạy bằng quyền quản trị mới lưu được file).

  3. Trong Notepad, chọn File -> Open. Trỏ tới đường dẫn: C:\Windows\System32\drivers\etc.

  4. Ở góc dưới bên phải cửa sổ mở file, đổi Text Documents (.txt)* thành All Files (.) để hiển thị các file ẩn.

  5. Nháy đúp để mở file hosts.

  6. Kéo xuống dòng cuối cùng của file, gõ thêm: 192.168.100.10 tintuc.local (Lưu ý: Thay 192.168.100.10 bằng IP thực tế của máy ảo ở Bước 2).

  7. Nhấn Ctrl + S để lưu lại và đóng Notepad.

BƯỚC 6: Trải nghiệm thành quả trên trình duyệt

  1. Ngay trên Máy thật, mở trình duyệt web (Google Chrome, Edge, Cốc Cốc…).

  2. Gõ lên thanh địa chỉ: http://tintuc.local và nhấn Enter.

  3. Trình duyệt của máy thật sẽ gửi yêu cầu xuyên qua phần mềm ảo hóa, đi vào máy ảo Windows Server, chui qua cổng 80 của Firewall, đến phần mềm IIS. IIS sẽ phân giải tên miền (Bindings), lấy mã nguồn HTML và trả ngược lại ra ngoài trình duyệt máy thật.

  4. Kết quả: Màn hình Chrome trên máy thật hiển thị đúng giao diện Website bạn đã tạo bên trong máy ảo.

💡 Một số lỗi thường gặp khi học sinh thực hành:

  • Lỗi trình duyệt tự nhảy sang tìm kiếm Google: Trình duyệt hiện nay rất thông minh, nếu gõ tintuc.local nó tưởng là từ khóa tìm kiếm. Hãy gõ đầy đủ chữ http:// ở phía trước (VD: http://tintuc.local).

  • Lỗi không lưu được file hosts: Do quên mở Notepad bằng quyền Run as administrator.

  • Lỗi trang web cứ xoay vòng vòng rồi báo Time Out: 99% là do chưa làm Bước 3 (mở Port 80 trên Firewall của máy ảo) hoặc Firewall của mạng chưa thông. Cần tắt tắt tạm Firewall trên máy ảo để test nhanh.

2.2. Triển khai truyền tải dữ liệu an toàn (FTP/SFTP)

2.2.1. Lý thuyết cơ bản về FTP và Isolation

  • FTP vs SFTP: FTP (Port 21) truyền dữ liệu dạng văn bản rõ, tốc độ nhanh nhưng kém an toàn. SFTP (Port 22) chạy qua giao thức SSH, mọi dữ liệu và mật khẩu đều được mã hóa.

  • FTP User Isolation (Cô lập người dùng): Khi máy chủ chứa nhiều website của nhiều khách hàng, tính năng này sẽ khóa chặt (chroot jail) người dùng ở đúng thư mục của họ. Khi đăng nhập, họ không thể lùi ra thư mục gốc ổ C để xem trộm dữ liệu hệ thống hoặc của người khác.

2.2.2. THỰC HÀNH: Cấu hình FTP với tính năng Cô lập người dùng

Trong kịch bản này, Máy ảo (Windows Server) sẽ đóng vai trò là Máy chủ FTP, còn Máy thật (Windows 10/11) sẽ đóng vai trò là Máy khách (Client).

BƯỚC 1: Chuẩn bị cấu hình mạng và lấy IP của Máy ảo

  1. Đảm bảo Card mạng của máy ảo đang ở chế độ NAT hoặc Bridged (giống như bài thực hành Web).

  2. Bật máy ảo Windows Server, mở cmd, gõ ipconfig để lấy địa chỉ IP. (Giả sử IP máy ảo là 192.168.100.10).

  3. Từ Máy thật, mở cmd và gõ ping 192.168.100.10 để đảm bảo máy thật và máy ảo đã thông mạng với nhau.

BƯỚC 2: Cấu hình FTP Isolation bên trong MÁY ẢO

Bạn thực hiện y hệt các bước đã học ở bài trước hoàn toàn bên trong Máy ảo:

  1. Tạo Local User: Tạo tài khoản tên user1 (đặt mật khẩu không hết hạn).

  2. Tạo cấu trúc thư mục bắt buộc: Vào ổ C: của máy ảo tạo đúng cấu trúc: C:\FTP_Chung\LocalUser\user1.

  3. Cấp quyền Full Control cho user1 trên thư mục của nó.

  4. Mở IIS Manager -> Tạo FTP Site mới trỏ vào C:\FTP_Chung -> Kích hoạt tính năng FTP User Isolation (chọn User name directory).

BƯỚC 3: Mở Port 21 Tường lửa trên Máy ảo (Cực kỳ quan trọng)

FTP hoạt động trên Port 21. Nếu bạn không mở cổng này, máy thật sẽ bị tường lửa của máy ảo chặn lại ngay lập tức.

  1. Bên trong Máy ảo, mở Windows Defender Firewall with Advanced Security.

  2. Chọn Inbound Rules -> New Rule…

  3. Chọn Port -> Chọn TCP, gõ 21 vào ô Specific local ports -> Next.

  4. Chọn Allow the connection -> Next liên tục và đặt tên Rule là Open FTP Port 21 -> Finish. (💡 Mẹo: Để học sinh thực hành test nhanh không bị lỗi “Failed to retrieve directory listing” do kết nối Passive FTP, giáo viên có thể cho học sinh Tắt tạm thời Firewall của máy ảo trong lúc test).

BƯỚC 4: Kiểm tra kết quả từ MÁY THẬT (Đóng vai Khách hàng)

  1. Trên Máy thật, mở phần mềm FileZilla Client (nếu chưa có thì tải bản miễn phí trên mạng).

  2. Điền thông tin kết nối vào thanh ngang trên cùng của FileZilla:

    • Host: 192.168.100.10 (IP của Máy ảo lấy ở Bước 1).

    • Username: user1

    • Password: Mật khẩu của user1 bạn đã tạo.

    • Port: 21

  3. Bấm Quickconnect.

  4. Đánh giá kết quả:

    • Nhìn vào cửa sổ góc dưới bên phải (Remote site), nếu bạn thấy chữ / (thư mục gốc) trống trơn và bạn có thể thử kéo thả 1 file từ máy thật sang máy ảo thành công -> Đã kết nối FTP thành công.

    • Bấm nút “lùi ra thư mục cha” (..). Nếu bạn không thể lùi ra ngoài để nhìn thấy ổ C: hoặc thư mục LocalUser của Server -> Tính năng Cô lập (Isolation) đã hoạt động hoàn hảo!

⚠️ 3 Lỗi học sinh hay gặp nhất khi làm bài này trên máy ảo:

  1. Lỗi 530 User cannot log in: 99% là do bước tạo thư mục gõ sai chính tả. Bắt buộc phải là LocalUser (L và U viết hoa, viết liền), và thư mục con phải trùng 100% với tên đăng nhập (vd: user1).

  2. Lỗi Time out / Could not connect to server: Do chưa làm Bước 3 (mở Port tường lửa 21) hoặc máy thật và máy ảo khác dải mạng, chưa ping thấy nhau.

  3. Lỗi ECONNREFUSED – Connection refused: Do lúc khai báo FTP Site trong IIS quên chưa Start dịch vụ FTP, hoặc khai báo sai IP Bindings (Nên để All Unassigned).

2.3. Quản trị Web Server trên Linux (LAMP/LEMP Stack)

2.3.1. Lý thuyết kiến trúc LAMP/LEMP

Hơn 70% website trên Internet hiện nay chạy trên nền tảng Linux mã nguồn mở bằng giao diện dòng lệnh (CLI).

  • L (Linux): Hệ điều hành nền tảng (Ubuntu, CentOS).

  • A (Apache) / E (Nginx – đọc là Engine-X): Web Server. Nginx hiện được ưa chuộng hơn vì khả năng chịu tải kết nối đồng thời cực tốt.

  • M (MariaDB/MySQL): Hệ quản trị Cơ sở dữ liệu.

  • P (PHP): Ngôn ngữ lập trình xử lý logic.

  • Server Block (Nginx): Tương đương với Bindings trên IIS, dùng để trỏ tên miền vào đúng thư mục vật lý chứa mã nguồn (vd: /var/www/html/mywebsite).

2.3.2. THỰC HÀNH: Xây dựng máy chủ LEMP Stack và cài WordPress

PHẦN 1: THAO TÁC TRÊN MÁY ẢO (ĐÓNG VAI TRÒ LÀ WEB SERVER LINUX)

Học sinh khởi động máy ảo Ubuntu/CentOS, mở ứng dụng Terminal (cửa sổ dòng lệnh) và làm việc hoàn toàn bằng lệnh.

Bước 1: Lấy địa chỉ IP và Mở tường lửa (Rất quan trọng)

  1. Gõ lệnh lấy địa chỉ IP của máy ảo:

    Bash
    ip a
    

    (Ghi ra giấy địa chỉ IP, ví dụ: 192.168.100.20)

  2. Mở Port 80 (HTTP) trên tường lửa của Ubuntu (UFW) để cho phép máy thật truy cập vào:

    Bash
    sudo ufw allow 80/tcp
    sudo ufw reload
    

Bước 2: Cài đặt LEMP Stack (Nginx, MariaDB, PHP)

  1. Cài đặt Web Server Nginx và Database MariaDB:

    Bash
    sudo apt update
    sudo apt install nginx mariadb-server -y
    
  2. Cài đặt PHP và các tiện ích đi kèm bắt buộc cho WordPress:

    Bash
    sudo apt install php-fpm php-mysql php-curl php-gd php-mbstring php-xml php-zip -y
    

Bước 3: Tạo Cơ sở dữ liệu (Database) cho Website

  1. Truy cập vào trình quản lý MySQL:

    Bash
    sudo mysql -u root
    
  2. Cấp Database, User và Mật khẩu (Gõ từng dòng và Enter):

    SQL
    CREATE DATABASE db_wordpress;
    CREATE USER 'user_wp'@'localhost' IDENTIFIED BY 'MatKhauKho123!';
    GRANT ALL PRIVILEGES ON db_wordpress.* TO 'user_wp'@'localhost';
    FLUSH PRIVILEGES;
    EXIT;
    

Bước 4: Tải mã nguồn WordPress và phân quyền

  1. Tải bộ cài WordPress mới nhất về và giải nén:

    Bash
    cd /tmp
    wget https://wordpress.org/latest.tar.gz
    tar -xvzf latest.tar.gz
    
  2. Di chuyển toàn bộ code vào thư mục web:

    Bash
    sudo mv wordpress /var/www/html/myblog
    
  3. Cấp quyền (Cực kỳ quan trọng): Để WordPress có thể tự động tải ảnh lên, ta phải giao quyền sở hữu thư mục này cho tài khoản của Nginx (tên là www-data):

    Bash
    sudo chown -R www-data:www-data /var/www/html/myblog
    sudo chmod -R 755 /var/www/html/myblog
    

Bước 5: Cấu hình Server Block (Trỏ tên miền)

  1. Dùng trình soạn thảo Nano tạo file cấu hình cho web myblog.local:

    Bash
    sudo nano /etc/nginx/sites-available/myblog
    
  2. Dán đoạn cấu hình chuẩn sau vào:

    Nginx
    server {
        listen 80;
        server_name myblog.local;
        root /var/www/html/myblog;
        index index.php index.html;
    
        location / {
            try_files $uri $uri/ /index.php?$args;
        }
    
        location ~ \.php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; 
        }
    }
    

    (💡 Lưu ý : Cần kiểm tra phiên bản PHP thực tế đang cài để sửa số 8.1 cho đúng).

  3. Bấm Ctrl + O -> Enter để lưu. Bấm Ctrl + X để thoát.

  4. Kích hoạt Web và khởi động lại Nginx:

    Bash
    sudo ln -s /etc/nginx/sites-available/myblog /etc/nginx/sites-enabled/
    sudo systemctl restart nginx
    

PHẦN 2: THAO TÁC TRÊN MÁY THẬT (ĐÓNG VAI TRÒ LÀ KHÁCH HÀNG)

Học sinh thu nhỏ máy ảo Linux lại, trở về màn hình Windows của máy trường để giả lập làm người dùng đang truy cập Internet.

Bước 1: Sửa file Hosts (Giả lập hệ thống DNS)

  1. Mở Notepad bằng quyền Run as administrator.

  2. Mở file theo đường dẫn C:\Windows\System32\drivers\etc\hosts.

  3. Thêm dòng khai báo để máy tính hiểu tên miền trỏ về máy ảo: 192.168.100.20 myblog.local (Nhập IP máy ảo lấy ở Bước 1 Phần 1).

  4. Lưu file lại.

Bước 2: Chạy cài đặt Website trên Trình duyệt

  1. Mở Google Chrome trên Máy thật, gõ vào thanh địa chỉ: http://myblog.local.

  2. Trình duyệt sẽ xuyên qua mạng, gọi vào máy ảo Linux. Màn hình cài đặt WordPress sẽ hiện ra.

  3. Học sinh thực hiện điền các thông tin kết nối Database đã tạo ở máy ảo:

    • Database Name: db_wordpress

    • Username: user_wp

    • Password: MatKhauKho123!

  4. Bấm Run Installation, tạo tài khoản Admin (Quản trị viên) và đăng nhập vào bảng điều khiển (Dashboard) của Website. Hoàn thành bài Lab!

⚠️ 3 Lỗi học sinh thường xuyên gặp phải ở bài này:

  1. Lỗi 502 Bad Gateway trên trình duyệt: * Nguyên nhân: Khai báo sai đường dẫn file php-fpm.sock trong Nginx. Ví dụ máy cài PHP 8.3 nhưng cấu hình Nginx lại gõ là 8.1.

    • Cách sửa: Vào Linux gõ lệnh ls /var/run/php/ để xem tên file chuẩn xác là gì và sửa lại trong file cấu hình nano.

  2. Trình duyệt báo “This site can’t be reached” (Time out):

    • Nguyên nhân: Chưa mở Port 80 trên tường lửa UFW của Linux hoặc máy thật và máy ảo khác lớp mạng.

  3. Cài WordPress xong, up ảnh lên báo lỗi “Unable to create directory”:

    • Nguyên nhân: Quên chạy lệnh chown ở Bước 4 (Phần 1). Web Server không có quyền ghi file vào ổ cứng.

3. Câu hỏi ôn tập và Kiểm tra (1 giờ)

  1. Hỏi: Application Pool trong IIS có tác dụng gì? Điều gì xảy ra nếu tất cả 10 website trên máy chủ đều chạy chung trong 1 Application Pool?

  2. Hỏi: Để cấu hình 3 website hoạt động độc lập trên cùng một Máy chủ Windows (cùng 1 IP và cùng Port 80), bạn phải sử dụng thiết lập nào trong IIS?

  3. Hỏi: FTP User Isolation giải quyết bài toán bảo mật nào khi cung cấp dịch vụ Hosting cho nhiều khách hàng khác nhau?

  4. Hỏi: Trong hệ sinh thái LEMP Stack, tiến trình MariaDB đóng vai trò gì? Kể tên một câu lệnh Linux để cấp quyền sở hữu thư mục web cho tài khoản Nginx (www-data).

  5. Kiểm tra thực hành: Giảng viên yêu cầu học sinh tự cấu hình thành công 1 Virtual Directory trên IIS và thực hiện kết nối bằng FileZilla an toàn (Không dùng tài liệu).