[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 Hostsconf
: configurationmods
: 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ệnh1
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
2Listen 81
Listen 82
Sau đó bạn có thể sử dụng cổng này trong Virtual host đơn giản1
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ần1
2sudo 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 | sudo a2enmod proxy |
SSL
Tham số có trong config của bạn1
SSLEngine On
Khi đó bạn cần enable module:1
sudo a2enmod ssl
Header
Ví dụ tham số trong cấu hình: RequestHeader1
RequestHeader set X-Forwarded-Proto "https"
Khi đó bạn cần enable module:1
sudo a2enmod headers
Authentication and Authorization
- https://httpd.apache.org/docs/2.4/howto/auth.html
- https://www.digitalocean.com/community/tutorials/how-to-set-up-password-authentication-with-apache-on-ubuntu-14-04
$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 apache21
2
3$ apache2ctl -t -D DUMP_MODULES
OR
$ apache2ctl -M
Xem các thông số server1
$ 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ạn1
2User: 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ạn1
2sudo 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
command1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25Usage: /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 hostNhư 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
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> - 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ị
ServerName
vàServerAlias
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 | AllowOverride 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áp1
2
3
4
5AllowOverride 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
3Require 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 con1
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ề Require
và Allow
:
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
[Web Server] Apache Notes