Một vài lưu ý khi cấu hình môi trường web

Bạn là một web developer? Bạn nghĩ rằng, chỉ cần tập trung code tốt, code đẹp và làm sao ít bug nhất là được. Còn những công việc khác như cấu hình môi trường dev, deploy code lên staging hay những công việc tương tự như vậy thì không cần quá chú tâm. Nhưng hãy tưởng tượng, vào một ngày đẹp trời, bạn được giao task setting enviroment cho cả team code, hay là deploy code lên stagging lên cho khách hàng. Lúc đó nếu bạn không có sự chuẩn bị trước về kiến thức chắc chắn sẽ lúng túng và gặp nhiều khó khăn. Nhân tiện thời gian gần đây, tôi đang làm nhiều về phần này nên có một vài kinh nghiệm đúc rút được ra trong quá trình làm. Hôm nay rảnh rỗi ngồi viết lại lên đây để cho những bạn chưa từng làm qua những công việc này có thể tham khảo? ^^

Cài đặt SSL (HTTPS)

  • SSL là gì? Nếu bạn serch với google với từ khóa này sẽ có vô vàn câu trả lời cho bạn. Tôi xin trích dẫn một trong những đáp án tôi search được ra đây cho các bạn tiện theo dõi

SSL (Secure Sockets Layer) là một công nghệ bảo mật tiêu chuẩn cho việc thiết lập một liên kết được mã hóa giữa máy chủ và máy khách – thường là một máy chủ web (trang web) và một trình duyệt, hoặc một máy chủ mail và mail client (ví dụ, Outlook).

Nhưng trong bài này, tôi không đi sâu tìm hiểu về SSL là gì? cũng như cơ chế hoạt động của nó. Mà trọng tâm bài này của tôi là hướng dẫn mọi người thiết lập cho web server của mình có thể chạy được SSL.

  • Bước 1: Tạo CSR và Private Key

    Để chạy được SSL bạn cần phải gửi một CSR(Certificate Signing Request) đến nhà cung cấp SSL. Để tạo CSR và Private Key sử dụng câu lệnh sau:

    // Tạo Private Key
    openssl genrsa 2048 > "path_to_key/ssl.key"
    
    // Tạo CSR
    openssl req -new -x509 -nodes -days 365 -subj "/C=VN/ST=Ha Noi/L=Ha Noi City/O=Test/OU=Test/CN=Test" -key "path_to_key/ssl.key" -out "path_to_key/ssl.crt"
    

    Trong câu lệnh tạo CSR bạn có thể thấy các ký tự việt tắt như C, ST, ... . nó thay thế cho các câu hỏi khi trạo CSR như sau:

    • C: Country Name (2 letter code) [AU]
    • ST: State or Province Name (full name) [Some-State]
    • L: Locality Name (eg, city) []
    • O: Organization Name (eg, company) [Internet Widgits Pty Ltd]
    • OU: Organizational Unit Name (eg, section) []
    • CN: Common Name (e.g. server FQDN or YOUR name) []

    Thay đổi tên file thích hợp với nhu cầu xử dụng của chính mình.

  • Bước 2: Cài đặt SSL Sau khi tạo xong File CSR và Private Key, bước tiếp theo là cài enable chúng trên web server của bạn.

    Nginx

    Mở file config của nginx trên server và thêm dòng code sau:

      server {
          listen 443;
          server_name ....
          root ...
          ssl on;
          ssl_certificate /path_to_crt_file/file_name.crt;
           ssl_certificate_key /path_to_private_file/file_name.key;
      }
    

Lưu lại và reload nginx. Sau đó truy cập vào địa chỉ https://your_server_name để xem thành quả nhé. 😄. Khi bạn đã cài xong SSL rồi, nhưng do thói quen hay là vì lý do nào đó mà bạn quên không nhập https thì server sẽ báo lỗi. Vậy hãy thêm dòng code sau để mỗi khi bạn quên không nhập https thì hệ thống sẽ tự đổng chuyển sang https cho bạn. Thật tiện dụng đúng không?

server {
  listen         80;
  server_name    your_server_name;
  return         301 https://$server_name$request_uri;
}

Lưu ý là cần phải định nghĩa riêng một khối server {} mới hoàn toàn chứ không thêm code vào cùng khối server mà bạn dùng để config ssl nhé.

Hiện nay giao thức HTTP/2.0 đã ra đời để thay thế cho giao thức HTTP/1.1. Các bạn đọc thêm tài liệu trên google để biết thêm sự khác biết giữa hai giao thức này nhé. Để web server của bạn đang chạy với giao thức HTTP/1.1 sang sử dụng giao thức HTTP/2.0 vô cùng đơn giản. Sửa lại file config của nginx với nội dung sau:

server {
    listen 443 ssl http2 default_server;
}

Vậy là xong, reload lại nginx và reload lại trình duyêt của bạn. Chọn kiểm tra phần tử và check protocol, bạn sẽ thấy giao thức được sử dụng bây giờ sẽ là h2.

Apache

Đối với apache thì hãy thêm 1 file default-ssl.conf trong thư mục sites-enabled với nội dung sau:

<VirtualHost _default_:443>
    ServerName your_server_name
    ServerAlias your_server_alias

    SSLEngine on
    SSLCertificateFile  /path_to_file/file_name.crt
    SSLCertificateKeyFile /path_to_file_private_key/file_name.key
    SSLVerifyClient none

    DocumentRoot your_document_root
    <Directory path_to_root>
        Require all granted
        Order Allow,Deny
        Allow from All
    </Directory>

    ErrorLog path_to_file_log/file_name.log
    CustomLog /path_to_access_file/access.log combined
</VirtualHost>

Chú ý, hãy đảm bảo rằng server của bạn đã cài đặt và enable mod_ssl. Sau khi hoàn tất, restart apache2 server và truy cập vào website của bạn với https.

Cài đặt Alias cho URL

Bạn build được môi trường và nó đang chạy mượt mà trên địa chỉ https://your_server_name/your_route thì đột nhiên có yêu cầu là cần chạy website của bạn với url có dạng https://your_server_name/viblo/your_route. Lúc này, bạn cần hiểu vấn đề ở đây là cần config cho website của bạn chạy với alias là viblo. Thực hiện theo các bước.

Nginx

Mở file config của nginx và thêm đoạn code sau:

location /viblo {
        alias /path_to_folder_has_file_index/;
        index index.php index.html index.htm;
        try_files $uri $uri/ @viblo;

        location ~ \.php$ {
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass php-fpm;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $request_filename;
            fastcgi_param DOCUMENT_ROOT $realpath_root;
            include fastcgi_params;
            internal;
        }
    }

    location @viblo {
        rewrite ^/viblo/(.*)$ /viblo/index.php?/$1 last;
    }

Sau đó, reload lại nginx và vào lại website của bạn với đường dần '/viblo/your_route'.

Apache

Thêm dòng code sau vào file config default của apache (nếu bạn không chạy qua ssl) vào file ssl config (nếu bạn đang chạy ssl)

    DocumentRoot /path_to_html_folder/
    Alias /viblo "/path_to_html_folder/path_to_your_project/path_to_folder_has_file_index"
    <Directory "/path_to_html_folder/path_to_your_project/path_to_folder_has_file_index">
        AllowOverride all
        Order allow,deny
        Allow from all
    </Directory>

Ngoài ra, trong file .htaccess của project, Cần thêm đoạn code sau:

<IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteBase /viblo/
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule ^(.*)$ index.php/$1 [L]
    </IfModule>

Sau khi hoàn tất, reoload apach2 service rồi truy cập vào website của bạn với alias là viblo.

Enable Basic AuthType

Để enable Basic AuthType cho server của bạn, trước tiên cần tạo file .htpasswd bằng câu lệnh sau:

sudo htpasswd -c /etc/apache2/.htpasswd test_user

Thay đổi test_user bằng user name bạn muốn config. Sau khi chạy lệnh này thì sẽ có question yêu cầu bạn nhập vào password của username này. Hãy đảm bảo là bạn sẽ nhớ chính xác password này. Vì username và password sẽ dùng để đăng nhập vào website của bạn. Tiếp theo, trong file 000-default.conf hãy thêm dòng config sau:

<VirtualHost *:80>
    DocumentRoot /var/www/html
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    <Directory "/var/www/html">
        AuthType Basic
        AuthName "Restricted Content"
        AuthUserFile /path_to_file_htpasswd/.htpasswd
        Require valid-user
    </Directory>
</VirtualHost>

Còn trong file apache2.conf thì thay đổi

<Directory /var/www/>
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>

Sau khi hoàn tất, reload apache server và truy nhập lại vào trang web của bạn. hệ thống sẽ báo lên alert dạng như:

Hãy nhập thông tin username và password ở bước tạo file .htpasswd ở trên để sử dụng hệ thống của bạn.

Trên đây là một số kinh nghiệm của bản thân mình. Chúc mọi người thành công.