Apache网站

多线程优缺点

共享资源,减少开销

公用进程,遇突发则全丢失

HTTP协议

  • 超文本传输协议
  • 基于TCP/IP通信协议来传递数据
  • 工作于C/S或B/S架构
  • 状态码:
    • 1xx:指示信息——表示请求已经接收,继续处理
    • 2xx:成功——表示请求已经被成功接收、理解、接收
    • 3xx:重定向——要完成请求必须进行更进一步的操作
    • 4xx:客户端错误——请求的语法有错误或请求无法实现
    • 5xx:服务端错误——服务器未能实现合法的请求!
    • 200:OK请求已经正常处理完毕
    • 301:请求永久重定向
    • 302:请求临时重定向
    • 304:请求被重定向到客户端本地缓存
    • 400:客户端请求存在语法错误
    • 401:客户端请求没有经过授权
    • 403:客户端的请求被服务器拒绝,一般为客户端没有访问权限
    • 404:客户端请求的URL在服务端不存在
    • 500:服务端永久错误
    • 503:服务端发生临时错误

Apache服务

  • 互联网最流行的web服务软件
  • MPM工作模式
    • prefork(默认):多进程I/O模型,一个主进程,管理多个子进程,一个子进程处理一个请求。
    • worker:复用的多进程I/O模型,多进程多线程,一个主进程,管理多个子进程,一个子进程 管理多个线程,每个 线程处理一个请求。
    • event:事件驱动模型,一个主进程,管理多个子进程,一个进程处理多个请求。
  • 文件说明
  1. /etc/httpd/:主配置文件目录
  2. /etc/httpd/conf/httpd.conf:服务配置文件
  3. /etc/httpd/conf.d/:服务配置目录(模块化)
  4. /etc/httpd/conf.modules.d/:模块配置目录
  5. /etc/sysconfig/httpd:守护进程配置文件
  6. /usr/lib64/httpd/modules/:可用模块
  7. /usr/sbin/:相关命令目录
  8. /var/log/httpd/:日志目录
  9. /var/www/:站点目录
  • 主配置文件
  1. 主配置说明

  2. [root@node3 ~]# grep “ [ #]” /etc/httpd/conf/httpd.conf
  3. ServerRoot “/etc/httpd” # 服务器的根
  4. Listen 80 # 监听的端口
  5. Include conf.modules.d/.conf # 包含模块
  6. User apache # 用户
  7. Group apache # 属组
  8. ServerAdmin root@localhost # 服务器管理员
  9. DocumentRoot “/var/www/html”
  10. ErrorLog “logs/error_log” # 错误日志
  11. LogLevel warn # 日志等级
  12. EnableSendfile on # 开启
  13. IncludeOptional conf.d/*.conf # 虚拟服务器配置文件
  14. 说明:<>此类称之为容器,针对某个容器做配置

持久连接

HTTP连接建立在TCP建立上,有效通信两个数据包加7个请求包,

功能: 在不断开TCP连接的基础上继续新的请求。

  • 默认参数
    1. KeepAlive默认是on,默认的超时时间是5秒。
    2. KeepAliveTimeout # 连接超时
    3. MaxKeepAliveRequests # 最大保持连接请求
  • 测试持久连接
    ```bash [root@server ~]# yum install telnet -y

[root@server ~]# echo ‘this is test!’ > /var/www/html/index.html

[root@server ~]# telnet 127.0.0.1 80

Trying 127.0.0.1… Connected to 127.0.0.1.

Escape character is ‘^]’.

GET / HTTP/1.1

Host:127.0.0.1

HTTP/1.1 200 OK

Date: Wed, 14 Jul 2021 14:17:29 GMT

Server: Apache/2.4.6 (CentOS)

Last-Modified: Wed, 14 Jul 2021 14:16:40 GMT

ETag: “e-5c71600ca9dad”

Accept-Ranges: bytes Content-Length: 14

Content-Type: text/html; charset=UTF-8

this is test!

Connection closed by foreign host.

  1. <a name="8135be8d"></a>
  2. ## prefork模式
  3. **优点:**每个请求相对独立,一个请求不会影响到其他的请求
  4. **缺点:**一个进程占用更多系统资源,消耗更多内存,不擅长处理高并发请求。
  5. ```bash
  6. [root@server ~]# httpd -V
  7. AH00558: httpd: Could not reliably determine the server's fully qualified
  8. domain name, using fe80::eaf3:dc40:2bf:6da2. Set the 'ServerName' directive
  9. globally to suppress this message
  10. Server version: Apache/2.4.6 (CentOS)
  11. Server built: Nov 16 2020 16:18:20
  12. Server's Module Magic Number: 20120211:24
  13. Server loaded: APR 1.4.8, APR-UTIL 1.5.2
  14. Compiled using: APR 1.4.8, APR-UTIL 1.5.2
  15. Architecture: 64-bit
  16. Server MPM: prefork
  17. threaded: no
  18. forked: yes (variable process count)
  • 切换apache的mpm工作模式

  • 若要使用worker和event工作模型,只需要在/etc/httpd/conf.modules.d/00-mpm.conf中取消 对应注释即可
  • 修改prefork参数
    1. 默认参数:
    2. StartServers 5 # 服务启动时的进程数
    3. MaxSpareServers 10 # 最大空闲服务进程数
    4. MinSpareServers 5 # 最小空闲进程数
    5. MaxRequestWorkers 256 # 单个进程最多接受的进程数
    6. [root@server ~]# vim /etc/httpd/conf.d/mpm.conf
    7. StartServers 10
    8. MaxSpareServers 15
    9. MinSpareServers 10
    10. MaxRequestWorkers 256
    11. MaxRequestsPerChild 4000
    12. [root@localhost ~]# systemctl restart httpd
    13. [root@server ~]# ps -ef | grep httpd

访问控制机制

基于IP地址访问控制

  • 定义服务器文档页面路径
    ```bash # 定义服务器的文档的页面路径:

[root@server1 conf]# vim httpd.conf …… DocumentRoot “/data/www/html” ……

# 开放对应目录权限

Require all granted

  1. - 黑名单
  2. ```bash
  3. <RequireAll>
  4. Require all granted
  5. Require not ip 172.16.1.1 #拒绝特定IP
  6. </RequireAll>
  • 白名单

    1. <RequireAny>
    2. Require all denied
    3. require ip 172.16.1.1 #允许特定IP
    4. </RequireAny>
  • 网段

    1. <requireany>
    2. require all denied
    3. Require ip 192.168.39.0/24
    4. </requireany>
  • 主机

    1. <Requireany>
    2. Require all denied
    3. Require ip 192.168.32.7 #只允许特定的主机访问
    4. </Requireany>

用户访问控制

认证方式有basic和digest两种

  • 创建用户认证文件
  1. [root@server1 ~]# htpasswd -c -m /etc/httpd/conf.d/.htpassword lisi
  2. New password:
  3. Re-type new password:
  4. Adding password for user lisi
  5. [root@server1 ~]# htpasswd -b -m /etc/httpd/conf.d/.htpassword zhangsan
  6. zhangsan
  7. Adding password for user zhangsan
  • 修改配置文件,启用用户认证
  1. [root@server1 ~]# vim /etc/httpd/conf/httpd.conf
  2. <Directory "/data/www/html">
  3. AuthType Basic
  4. AuthName "Restricted Resource"
  5. AuthBasicProvider file
  6. AuthUserFile /etc/httpd/conf.d/.htpassword
  7. Require user lisi
  8. </Directory>
  9. [root@server1 ~]# systemctl restart httpd.service

日志设定

  1. ErrorLog "logs/error_log"
  2. LogLevel warn
  3. <IfModule log_config_module>
  4. LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""
  5. combined
  6. LogFormat "%h %l %u %t \"%r\" %>s %b" common
  7. <IfModule logio_module>
  8. LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I
  9. %O"
  10. combinedio
  11. </IfModule>
  12. CustomLog "logs/access_log" combined
  13. </IfModule>
  • 日志参数
  1. 参数:
  2. %h Remote hostname
  3. %l Remote logname
  4. %u Remote user
  5. %t Time the request was received, in the format [18/Sep/2011:19:18:28 -0400]
  6. %r First line of request
  7. %s Status
  8. %b Size of response in bytes, excluding HTTP headers
  9. Referer 有利于分析用户是通过哪个网站转发的如通过baidu转发的,也可以监控网站盗链的发生。
  10. User-Agent 记录浏览器的类型。防止爬虫一定程度上,爬虫可以伪造浏览器类型。curl -A "evan"
  11. http://I(伪造名字叫evan的浏览器)

虚拟主机

基于IP地址虚拟主机

  1. [root@node3 data]# cat /etc/httpd/conf.d/site.conf
  2. <Directory "/data/">
  3. Require all granted
  4. </Directory>
  5. <VirtualHost 192.168.0.140:80>
  6. Servername www.site1.com
  7. DocumentRoot "/data/site1/"
  8. </VirtualHost>
  9. <VirtualHost 192.168.0.145:80>
  10. Servername www.site2.com
  11. DocumentRoot "/data/site2/"
  12. </VirtualHost>
  13. [root@node1 ~]# curl 192.168.0.142
  14. <h1>This is site1</h1>
  15. [root@node1 ~]# curl 192.168.0.145
  16. <h1>This is site2</h1>

基于端口虚拟主机

  1. [root@server1 ~]# cat /etc/httpd/conf.d/site.conf
  2. Listen 8080
  3. Listen 9090
  4. <Directory "/data/">
  5. Require all granted
  6. </Directory>
  7. <VirtualHost *:8080>
  8. DocumentRoot "/data/site3/"
  9. </VirtualHost>
  10. <VirtualHost *:9090>
  11. DocumentRoot "/data/site4/"
  12. </VirtualHost>
  13. [root@server1 ~]# curl 192.168.80.100:8080
  14. <h1>This is site3</h1>
  15. [root@server1 ~]# curl 192.168.80.100:9090
  16. <h1>This is site4</h1>

基于FQDN虚拟主机

  1. [root@server1 ~]# cat /etc/httpd/conf.d/site.conf
  2. Listen 10101
  3. <Directory "/data/">
  4. Require all granted
  5. </Directory>
  6. <VirtualHost 192.168.80.100:10101>
  7. Servername www.site5.com
  8. DocumentRoot "/data/site5/"
  9. </VirtualHost>
  10. <VirtualHost 192.168.80.100:10101>
  11. Servername www.site6.com
  12. DocumentRoot "/data/site6/"
  13. </VirtualHost>
  14. ~
  15. [root@server1 ~]# cat /etc/hosts
  16. 192.168.0.142 www.site5.com
  17. 192.168.0.142 www.site6.com
  18. [root@server1 ~]# curl www.site5.com:10101
  19. <h1>This is site5</h1>
  20. [root@server1 ~]# curl www.site6.com:10101
  21. <h1>This is site6</h1>

SSL配置

  • 安装mod_ssl和openssl

yum install mod_ssl openssl -y

  • 生成2048位的加密私钥server.key

openssl genrsa -out server.key 2048

  • 生成证书签名请求server.csr

openssl req -new -key server.key -out server.csr

  • 生成类型为X509的自签名证书。有效期设置3650天,即有效期为10年server.crt

openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt

  • 复制到对应位置

[root@node1 ~]# cp server.crt /etc/pki/tls/certs/

[root@node1 ~]# cp server.key /etc/pki/tls/private/

[root@node1 ~]# cp server.csr /etc/pki/tls/private/

  • 修改配置文件

Servername 192.168.0.140:443

SSLCertificateFile /etc/pki/tls/certs/server.crt

SSLCertificateKeyFile /etc/pki/tls/private/server.key

  • 防火墙放行

firewall-cmd --add-port=443/tcp --per

进程&线程

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基 本单位,是操作系统结构的基础。进程是线程的容器。进程是正在运行的程序的实例

线程(Threads)能独立运行的基本单位,进程是资源分配的最小单位,线程是CPU调度的最小单位.每一个进程中至少有一个线程

去除配置文件的注释

grep -v '#' httpd.conf.bak | grep -Ev '^$' > httpd.conf

Selinux

SELinux的全称是Security Enhanced Linux, 就是安全加强的Linux。

  1. setenforce 0|1 ## 0表示警告模式1表示强制模式
  2. ## 状态类型:
  3. disabled ## 关闭
  4. enforcing ## 强制 [不只警告,还会限制]
  5. permissive ## 警告 [只会警告,不会限制]

更改主机IP

/etc/sysconfig/network-scripts/ifcfg-ens33

  1. TYPE="Ethernet"
  2. PROXY_METHOD="none"
  3. BROWSER_ONLY="no"
  4. BOOTPROTO="static"
  5. DEFROUTE="yes"
  6. IPV4_FAILURE_FATAL="no"
  7. IPV6INIT="yes"
  8. IPV6_AUTOCONF="yes"
  9. IPV6_DEFROUTE="yes"
  10. IPV6_FAILURE_FATAL="no"
  11. IPV6_ADDR_GEN_MODE="stable-privacy"
  12. NAME="ens33"
  13. UUID="355e31ea-f2d3-4599-837e-755d9551b9af"
  14. DEVICE="ens33"
  15. ONBOOT="yes"
  16. IPADDR0=192.168.174.10
  17. NETMASK0=255.255.255.0
  18. GATEWAY0=192.168.174.2
  19. IPADDR1=192.168.174.20
  20. NETMASK1=255.255.255.0
  21. GATEWAY1=192.168.174.2
  22. DNS1=114.114.114.1