[Web Server] Apache Notes

Bài viết tổng hợp 1 vài note giúp mình thao tác Apache tốt hơn vào 1 ngày tìm lại được 2/3 đôi dép bị thất lạc

Tổng quan

Docs chính

https://httpd.apache.org/docs/2.4/

Apache2 quản lý 3 thứ quan trọng

  • sites: quản lý các Virtual Hosts
  • conf: configuration
  • mods: modules

Ứng với các thư mục conf-available, mods-availble, sites-available. Để bật tắt các site, conf, mods sử dụng lệnh

1
2
3
$ sudo a2enconf/a2disconf [conf_name]
$ sudo a2enmod/a2dismod [mod_name]
$ sudo a2ensite/a2dissite [virtual_host_site]

Server Logs

Logs trong apache2 mặc định được ghi tại

  • /var/log/apache2/access.log: By default, every request to your web server is recorded in this log file unless Apache is configured to do otherwise.
  • /var/log/apache2/error.log: By default, all errors are recorded in this file. The LogLevel directive in the Apache configuration specifies how much detail the error logs will contain.

Port config

Các cổng trong apache2 được cấu hình trong /etc/apache2/ports.conf. Mặc định, chỉ có 2 cổng được mở là 80 (dành cho các dịch vụ web http) vầ 443 (https). Bạn có thể mở thêm cổng (cái này dùng khi bạn muốn 1 domain triển khai nhiều projects khá hiệu quả - deploy lên staging chẳng hạn) bằng cách dùng thêm Listen

1
2
Listen 81
Listen 82

Sau đó bạn có thể sử dụng cổng này trong Virtual host đơn giản
1
2
3
4
5
6
<VirtualHost 10.0.0.1:81>
DocumentRoot "/www/domain"
</VirtualHost>
<VirtualHost 10.0.0.1:82>
DocumentRoot "/www/other-domain"
</VirtualHost>

Một vài modules trong Apache2

Tất cả các module trong Apache2 có thể tìm kiếm tại: https://httpd.apache.org/docs/2.4/mod/

Một vài modules hay sử dụng:
https://www.digitalocean.com/community/tutorials/how-to-install-configure-and-use-modules-in-the-apache-web-server

Rewrite Module

Một trong những modules hữu ích trong Apache. Module này cho phép bạn sinh ra url duy nhất và dễ dàng có thể đọc được với nội dung request trên server
Module này mặc định được cài trên Ubuntu khi Apache được cài đặt nhưng không được kích hoạt. Để bật nó bạn cần

1
2
sudo a2enmod rewrite
sudo service apache2 reload

Nếu chế độ này bị disale, khi truy cập vào URL tự sinh sẽ gây lỗi 404

Ngoài ra có 1 số module được sử dụng rất nhiều trong config cũng nên quan tâm

  • mod_authz_core: Các tham số liên quan đến xác thực người dùng (Require)
  • mod_access_compat: điều khiển truy cập các host nào được truy cập vào server

Proxy

1
2
3
sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod proxy_connect

SSL

Tham số có trong config của bạn

1
SSLEngine On

Khi đó bạn cần enable module:
1
sudo a2enmod ssl

Ví dụ tham số trong cấu hình: RequestHeader

1
RequestHeader set X-Forwarded-Proto "https"

Khi đó bạn cần enable module:
1
sudo a2enmod headers

Authentication and Authorization

$apacha2ctl, $apachectl command

Lệnh này coi như là font end của hệ thống Apache HTTP Server. Nó được thiết kế để giúp quản trị viên kiểm soát được các chức năng chạy ngầm của apache2

Kiểm tra các modules nào đang đang bật trên apache2

1
2
3
$ apache2ctl -t -D DUMP_MODULES   
OR
$ apache2ctl -M

Xem các thông số server
1
$ apache2ctl -S

Có các thông tin về các host nào, cổng và các tên host. Ngoài ra còn có thông tin về user và nhóm user bạn cần cấp quyền để truy cập vào ứng dụng của bạn
1
2
User: name="www-data" id=33
Group: name="www-data" id=33

và quyết định cấp quyền cho người dùng web-server vào thư mục của bạn
1
2
sudo chown www-data:www-data -R storage
sudo chown www-data:www-data -R bootstrap/cache

Các tùy chọn của apache2ctl command

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Usage: /usr/sbin/apache2 [-D name] [-d directory] [-f file]
[-C "directive"] [-c "directive"]
[-k start|restart|graceful|graceful-stop|stop]
[-v] [-V] [-h] [-l] [-L] [-t] [-T] [-S] [-X]
Options:
-D name : define a name for use in <IfDefine name> directives
-d directory : specify an alternate initial ServerRoot
-f file : specify an alternate ServerConfigFile
-C "directive" : process directive before reading config files
-c "directive" : process directive after reading config files
-e level : show startup errors of level (see LogLevel)
-E file : log startup errors to file
-v : show version number
-V : show compile settings
-h : list available command line options (this page)
-l : list compiled in modules
-L : list available configuration directives
-t -D DUMP_VHOSTS : show parsed vhost settings
-t -D DUMP_RUN_CFG : show parsed run settings
-S : a synonym for -t -D DUMP_VHOSTS -D DUMP_RUN_CFG
-t -D DUMP_MODULES : show all loaded modules
-M : a synonym for -t -D DUMP_MODULES
-t : run syntax check for config files
-T : start without DocumentRoot(s) check
-X : debug mode (only one worker, do not detach)

Cấu hình virtual host

Overview: https://httpd.apache.org/docs/2.4/vhosts/

Các tham số có ý nghĩa gì thì có thể tra ở đây:
https://httpd.apache.org/docs/2.4/mod/core.html#directory

Đây là một file cấu hình virtual host cơ bản, chúng ta cùng tìm hiểu các tham số và ý nghĩa của nó nhé:

1
2
3
4
5
6
7
8
9
10
11
12
13
<VirtualHost *:80>
ServerAdmin admin@laravel-demo.local
DocumentRoot /var/www/html/laravel-demo/public
ServerName laravel-demo.local
ServerAlias www.laravel-demo.local
<Directory /var/www/html/laravel-demo/public>
AllowOverride All
Order allow,deny
Allow from all
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Các tham số cơ bản

ServerAdmin: địa chỉ emainl, cái mà server sẽ dùng khi gửi message lỗi tới client.

ServerName and ServerAlias
Trước khi tìm hiểu 2 tham số này có ý nghĩa gì, chúng ta hãy xem cách mà Apache xử lý khi nhận 1 request với virtual host nhé. Sẽ có 2 cách apache2 tìm kiếm 1 host là dựa vào Name-based or IP-based Virtual Hosts, và khi cấu hình chúng ta cũng làm như vậy.

Name-based vs. IP-based Virtual Hosts

  • IP-based virtual hosts sử dụng địa chỉ IP để kết nối và xác định chính xác virtual host. Do đó bạn phải chia IP cho mỗi host
    1
    2
    3
    4
    5
    6
    7
    <VirtualHost 10.0.0.1:80>
    DocumentRoot "/www/domain"
    </VirtualHost>

    <VirtualHost 10.0.0.2:80>
    DocumentRoot "/www/otherdomain"
    </VirtualHost>
    Như ví dụ trên bạn thấy các host đang được chia theo địa chỉ IP. Apache sẽ duyệt và virtual host nào trùng địa chỉ IP và cổng thì sẽ tiến hành chọn virtual host đó xử lý request. Hạn chế cách này như đã nói ở trên, mỗi host cần có 1 địa chỉ IP riêng
  • Với name-based virtual hosting, server sẽ dựa vào phía client để báo lên hostname như 1 phần của HTTP headers. Sử dụng kỹ thuật này, rất nhiều hosts có thể dùng chung địa chỉ IP
  • Khi có yêu cầu đến, máy chủ sẽ tìm thấy đối số <Virtualhost> phù hợp nhất (cụ thể nhất) dựa trên địa chỉ IP và cổng được sử dụng bởi yêu cầu.
  • Nếu có nhiều hơn một máy chủ ảo chứa kết hợp cổng và địa chỉ phù hợp nhất này, Apache sẽ so sánh thêm các chỉ thị ServerNameServerAlias với tên máy chủ có trong yêu cầu.
  • Trong trường hợp không gán ServerName khi có nhiều hosts sử dụng chung địa chỉ IP và cổng, server sẽ gán cho nó 1 tên mặc định.
  • Tên này có thể dẫn đến việc kết hợp với virtual host lỗi, do đó không được khuyến khích. Tốt nhất là bạn nên tự đặt tên ServerNam cho server của mình.

Using Name-based Virtual Hosts

Ví dụ, bạn đang có server với domain www.example.com và bạn muốn thêm 1 virtual host với other.example.com, với 2 hosts đều trỏ tới cùng 1 địa chỉ IP.

1
2
3
4
5
6
7
8
9
10
11
<VirtualHost *:80>
# This first-listed virtual host is also the default for *:80
ServerName www.example.com
ServerAlias example.com
DocumentRoot "/www/domain"
</VirtualHost>

<VirtualHost *:80>
ServerName other.example.com
DocumentRoot "/www/otherdomain"
</VirtualHost>

Mỗi servers muốn có thể được truy cập bằng nhiều tên. Điều đó hoàn toàn có thể với ServerAlias directive, đặt bên trong <VirtualHost> section. Ví dụ: trong khối <Virtualhost> đầu tiên ở trên, chỉ thị ServerAlias chỉ ra rằng các tên được liệt kê là các tên khác mà mọi người có thể sử dụng để xem cùng một trang web:
1
ServerAlias example.com *.example.com

và sau đó request từ tất cả các host example.com domain sẽ được xử lý bởi www.example.com virtual host. Các ký tự đại diện * và? có thể được sử dụng để khớp tên.

Các Name-based virtual hosts cho bộ <Virtualhost> phù hợp nhất được xử lý theo thứ tự chúng xuất hiện trong cấu hình. ServerName hoặc ServerAlias phù hợp đầu tiên được sử dụng, không có quyền ưu tiên khác nhau cho các ký tự đại diện (cũng như cho ServerName so với ServerAlias).

Các tham số sub-directories

1
2
3
AllowOverride All
Order allow,deny
Allow from all

Các tham số Allow, Deny, Order đều nằm trong mod_access_compat, thêm đó còn có tham số Satisfy dùng khi có 1 số vùng cần hạn chế người dùng truy cập

AllowOverride

Loại đường dẫn cho phép .htaccess files (trả lời câu hỏi: apache2 load file .htaccess ở đâu?)

Cú pháp

1
2
3
4
5
AllowOverride All|None|directive-type [directive-type] ...

Với các giá trị
None: .htaccess file sẽ bị ignore. Trong trường hợp này, server sẽ thậm chí không đọc được
All: file.htaccess ở đâu cũng được

Allow from

Tham số này xác định hosts nào có thể truy cập vào khu vực trên server

Deny from

Ý nghĩa ngược lại với allow (Allow và deny có thể lấy từ config)

Order

Sắp xếp ưu tiên khi xử lý request

Satisfy

Mô tả: tích hợp giữa host-level access control và xác thực người dùng

Các chính sách về truy cập nếu cả Allow và Require được sử dụng. Tham số có thể là All hoặc Any. Tham số này hữu ích nếu quyền truy cập vào 1 số khu vực cụ thể bị hạn chế, cần có thông tin xác thực để truy cập chẳng hạn.

Ví dụ: nếu bạn muốn cho phép mọi người trong mạng của mình có quyền truy cập không hạn chế vào một phần của trang web của bạn, nhưng yêu cầu những người bên ngoài mạng của bạn cung cấp mật khẩu, bạn có thể sử dụng một cấu hình tương tự như sau:

1
2
3
Require valid-user
Allow from 192.168.1
Satisfy Any

Trường hợp khác hay được sử dụng hơn Satisfy directive để nới thêm truy cập cho 1 thư mục con
1
2
3
4
5
6
7
8
<Directory "/var/www/private">
Require valid-user
</Directory>

<Directory "/var/www/private/public">
Allow from all
Satisfy Any
</Directory>

Trong ví dụ trên, sự xác thực cần được thực hiện khi truy cập vào đường dẫn /var/www/private nhưng lại không cần khi truy cập vào đường dẫn /var/www/private/public

Ý kiến cá nhân về RequireAllow:

  • Tham số require thiên về việc xác thực người dùng được truy cập vào ứng dụng

  • Tham số Allow liên quan đến hosts nào và địa chỉ IP

Require

Xác thực, phân quyền người dùng. Chi tiết

Tổng kết

  • Apache quản lý 3 thứ: sites (virtual host), conf, modules
  • apache2ctl, apachectl giúp thao tác apache tốt hơn nhờ tương tác với các tiến trình ngầm của apache và hiển thị dưới dạng giao diện
  • Khi cấu hình virtual host có thể dùng Name-based vs. IP-based Virtual Hosts. Với IP-based Virtual Hosts yêu cầu bạn cần có nhiều địa chỉ IP (không thì bật nhiều host cũng được, môi trường test hoặc staging có thể mở nhiều host, khi lên product chỉ mở 80 mới là vấn đề)
    Khi cấu hình virtual host hãy tham khảo các tham số như ở trên nhé ServerName, ServerAlias, Required, Deny, Allow, Order :D
Author

Ming

Posted on

2019-11-21

Updated on

2021-08-20

Licensed under

Comments