ubuntu server-Web服务

WWW介绍

www 万维网

  • 静态网站:所有人看到的内容都一样
  • 动态应用程序:
    • 数据库、中间件
    • 每个用户看到的内容不同
    • 根据用户输入返回不同结果

访问方式

FQDN:(Fully Qualified Domain Name)全限定域名:同时带有主机名和域名的名称。(通过符号“.”)

传输协议 SSL基本被替代了,TSL使用最多 put常用于上传文件 options查看都支持哪些方法 header只是头部的信息(请求/响应)

HTTP协议

常见服务端响应状态码 更多详细状态码,见地址:

http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

Apache2

Apache软件基金会的一个开源Web服务器
模块化强大的扩展能力:

  • SSO模块
  • 并发限制模块
  • 日志监控模块
  • WAF模块
  • 负载均衡模块
  • 音乐/图像处理模块

安装

1
2
3
sudo apt install apache2

# 默认侦听端口 TCP 80

通过众多directives进行配置

在Ubuntu中,directives分散于多个配置文件中

配置文件:conf-enabled(启用的)中的文件都是链接到conf-available(可用的)下的配置文件(创建了链接的才生效的,所以可以配置一些备用的不设置链接),修改完需要重启服务 模块目录:mods-enabled与mods-available,跟上面两者关系类似 站点:sites-enabled与sites-available 不同ip以及不同端口可以映射不同的网站 –> 同一个ip同一个端口来设置多个网站(不同域名都解析到这个ip, 服务端根据域名字段[主机头]来判断返回哪个页面) –> 即为虚拟主机

虚拟主机简单配置

一般先从available目录开始创建,至于启用与否还得配置enabled 本质上配置指令可以位于任何一个配置文件中

配置sites-available下讲解:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# /etc/apache2/sites-available/000-default.conf  # 默认虚拟主机

<VirtualHost *:80>    # 匹配ip,*代表任意ip  , 侦听任意ip的80端口
	ServerName www.example.com			# 设置主机头(虚拟主机的域名)
	ServerAdmin webmaster@localhost		# 报错时显示的管理员邮箱
	DocumentRoot /var/www/html			# 指定Web根目录
	ErrorLog ${APACHE_LOG_DIR}/error.log		# 报错日志
	CustomLog ${APACHE_LOG_DIR}/access.log combined		# 访问日志
	# 侦听端口
</VirtualHost>

实验 创建alibaid两个域名的虚拟主机 1.创建新的虚拟主机(在sites-available)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 复制两个配置文件
sudo cp 000-default.conf ali.conf
sudo cp 000-default.conf baid.conf

# 分别进行配置
ServerName www.ali.com
DocumentRoot /var/www/ali
#
ServerName www.baid.com
DocumentRoot /var/www/baid

# 分别编辑页面文件
sudo vim /var/www/ali/index.html
sudo vim /var/www/baid/index.html

2.创建链接(在sites-enabled)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 可以用ln 创建

# apache提供了更简单的方式
sudo a2ensite ali  
sudo a2ensite baid
# 重新加载
service apache2 reload

## Note:
ServerAlias *.lab.com  # 域名通配符
sudo a2ensite mynewSite	# 启用虚拟主机
sudo systemctl restart apache2.service  # 重启服务
sudo a2dissite mynewSite	# 停用虚拟主机(禁用某个站点)

3.这里做实验,域名就简单通过hosts文件做了解析

1
2
192.168.11.130 www.ali.com
192.168.11.130 www.baid.com

3.访问

侦听端口
1
/etc/apaches/ports.conf
Apache中默认基本配置

1.索引文件index: DirectoryIndex

1
2
3
4
5
6
7
8
## 可以根据需求,手动修改索引页的名称(一般不建议修改)
# /etc/apache2/mods-available/dir.conf
<IfModule mod_dir.c>
    DirectoryIndex index.html index.cgi index.pl index.php index.xhtml index.htm  # 有先后的执行顺序
</IfModule>

# Note:
若没有正确放置index索引文件,会看到文件列表,可能会有安全隐患

2.html格式展示目录列表:Options 【安全考虑】–>去掉由于没有索引文件会显示文件列表的选项

1
2
3
4
5
6
7
8
## /etc/apache2/apache2.conf   主配置文件
<Directory /var/www/>   # 对文件目录权限的配置
    Options Indexes FollowSymLinks  # Indexes:若没有索引文件,就会显示目录列表;去掉Indexes就不会显示列表了,提示"权限拒绝"
    AllowOverride None
    Require all granted
</Directory>

# 重启服务

**3.Permission Denied ** 以上1,2两项都不匹配,就会显示"权限拒绝"

4.ErrorDocument 报错提示 【安全考虑】–> 默认404或报错页面会泄露信息或扫描器,建议替换为我们自定义的页面–>不告诉用户不成功的具体原因,只告诉他出错了

1
2
3
4
# /etc/apache2/conf-available/localized-error-pages.conf  
ErrorDocument 404 /error/404.html       # 定义自己的页面

# 重启服务

5.基于目录的Options

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
## /etc/apache2/apache2.conf   主配置文件
<Directory /var/www/> 
    Options Indexes 
</Directory>

# 其他配置项(权限要最小化原则,安全起见)
ExecCGI		# 允许CGI脚本执行的目录(/usr/lib/cgi-bin)
Includes	# 允许服务端包含(一个html包含另一个html,模板化)
IncludeNOEXEC	# 允许包含,但进展CGI脚本exec、include

# 重启服务

6.环境变量

1
2
3
4
5
6
# /etc/apache2/envvars	可以修改用户和组和pid等
User /Group 	# 服务器端应答客户端访问的账号(www-data)
PidFile			# /var/run/apache2/apache2.pid

# 最大并发数(默认8192)
APACHE_ULIMIT_MAX_FILES='ulimit -n 65536'

模块化

服务器核心只实现了基本功能

1
apache2 -l  # 查看默认被编译到apache核心包里面的模块

其他功能通过模块实现 ubuntu编译动态加载模块实现运行时模块调用

1
2
3
4
apt search libapache2-mod		# 搜索模块
sudo apt install libapache2-mod0auth-mysql	# 安装模块
sudo a2enmod auth_mysql			# 启用模块
sudo a2dismod auth_mysql		# 禁用模块

开启HTTPS

传输过程中的CIA (机密性、完整性、可用性),但是不提供应用层安全

 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
26
27
28
29
30
31
32
33
# /etc/apache2/sites-available/default-ssl.conf
sudo a2ensite default-ssl  # 开始ssl加密(默认未启动)
sudo a2ebmod ssl	# 默认未启动

_default_:443	# 未指定虚拟主机情况下的443端口访问, 默认是443(除了其他指定了虚拟主机名的,未指定的就访问到这里)
SSLEngine on	# 开启SSl/TSL
SSLCertificateFile  /etc/ssl/certs/ssl-cert-snakeoil.pem  # 证书文件(默认已经自带了一张证书)
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
SSLCertificateChainFile /etc/apache2/ssl.crt/server-ca.crt  # 证书的加密链文件
SSLCARevocationFile /etc/apache2/ssl.crl/ca-bundle.crl      # 证书吊销列表
SSLVerifyClient require   # 要求客户端提供证书(不可抵赖性)

<FilesMatch "\.(cgi|shtml|phtml|php)$">   # 基于文件类型,设置不同环境变量进行加密
      SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>    # 对指定目录
      SSLOptions +StdEnvVars    # 标准环境变量
</Directory>

ssl-unclean-shutdown   # 只是服务器端向客户端断开连接(追求速度)
ssl-accurate-shutdown	# 服务器端与客户端的连接端口了,客户端还有向服务端再确认(追求稳定性)

nokeepalive ssl-unclean-shutdown
downgrade-1.0 force-response-1.0	# 降级响应

# 还可以按自己需要...

## 启用并重启服务
sudo a2ensite default-ssl
service apache2 reload
sudo systemctl restart apache.service

## 可以访问了(ubuntu自己生成的证书浏览器会提示不安全)
证书

向证书颁发机构申请的合法证书就可以替换ubuntu自带的证书

1
2
3
4
5
# 使用CA机构签名证书
sudo openssl req -newkey rsa:2048 -nodes -keyout server.key -out server.pem

# 使用自签名证书
sudo openssl req -x509 -days 365 -sha256 -newkey rsa:2048 -nodes -keyout /etc/ssl/private/mysite.key -out /etc/ssl/certs/mysite.pem
创建HTTPS虚拟主机

和创建一般虚拟主机是类似的

建议商业证书颁发机构(权威机构颁发,默认受信,增强特性,收费高昂,有效期长)

那没钱怎么办呢? 有几家机构已经有免费的了,比如Let's encrypt Let’s encrypt

  • 致力于加速全文实现https的免费证书颁发机构
  • 证书有效期90天(可刷新)
  • 专门客户端程序 Certbot,简化证书步骤
1
2
3
sudo add-apt-repository ppa:certbot/certbot  # 添加仓库
sudo apt update
sudo apt install cerbot  python-cerbot-apache

使用方法:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 前提
域名正常解析、设置好虚拟主机

# 申请证书 (--apache意思是给apache用的, -d是域名,还有子域名)
sudo certbot --apache -d example.com -d www.example.com

# 证书位置
/etc/letsencrypt/live

# 查看证书状态(换成自己的域名)
https://www.ssllab.com/ssltest/analyze.html?d=example.com&latest

Apache支持PHP

1.安装

1
2
3
sudo apt install php7.2 libapache2-mod-php7.2   # mod-php模块
# 验证 
php -v

2.启用模块

1
2
3
4
# 直接启用即可
a2enmod php7.2

# Apache对php的支持是模块化的,而Nginx对php支持的配置方式比较原始

索引文件

1
2
3
4
vim  /etc/apache2/mods-available/dir.conf       # index.php

# 重启
sudo systemctl restart apache2

配置文件

1
2
/etc/php/7.2/    # 下面不同的目录,是针对不同应用的,这里apache的在apache子目录下面
/usr/lib/php/7.2/    # 为不同的使用场景的配置文件(开发环境与生产环境,一般情况下会把这里的文件链接到上面的配置中)

Keepalived

高可用的一种解决方案:Keepalived

实现高可用(HA)

  • 在服务器组内漂移的VIP(多台服务器实现一个组,但也是一个域名,解析到一个ip)
  • Master独占VIP,其他Server检查Master可用性
  • Keepalives并非专门针对Apache而设计
  • 常用于负载均衡技术环境
  • 组内服务器应提供相同内容和配置

组内不同服务器有优先级,多个服务器共用一个漂移的ip地址(VIP),处于正常状态的服务器叫Maste

安装

1
2
3
4
sudo apt-get install keepalived

# 因为无配置,所有默认启动失败
/etc/keepalived/keepalived.conf		# 配置文件(需要创建)

配置文件:

 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
# 可选配置项,但是一般建议配置
global_defs {  
    notification_email {
    myemail@mycompany.com   # 发送邮件给谁
    }
    notification_email_from keepalives@mycompany
    smtp_server 192.168.1.150
    smtp_connect_timeout 30
    router_id mycompany_web_prod
}
# 关键配置
# 1号配置实例
vrrp_instance VI_1 {
    smtp_alter
    interface enp0s3	 # 网卡接口优先级
    virtual_router_id 51 # 定义服务器组
    priority 100		 # 优先级(自己定义,保证顺序即可)
    advert_int 5		 # 周期性通告的间隔时间
    virtual_ipaddress {  
        192.168.1.200	 # VIP(DHCP以外)
    }
}


# 重启服务
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
systemctl start keepalived 
systemctl status -l keeplived
# 网卡绑定VIP
	 ip a
	 等待30s

# 安装第二台服务器,并进行类似的配置(优先级修改,vip地址填写一样的)

# 模拟切换
systemctl stop keepalived 
systemctl start keepalived 

不仅可以配合Apache使用,还可配合其他使用

Ubuntu 18.04新特性

哈哈哈,前几天20.04都已经正式发布了,我听课进度太慢

内核是关键

网络配置
多个地址,要用逗号分隔 重启服务:`sudo netplan apply` 桥接的物理网卡设置为没有ip

桌面端:

1
2
3
# ifconfig / ifup / if down  已经默认不安装了
# 对应上面
ip link set eth0 up  / ip link set eth0 down

networkctl命令

1
2
# 此命令地位更加突出
networkctl status / networkctl status eth0   # 查看不同网卡的状态和详细信息

ip命令 ip link

1
2
3
4
5
6
7
8
sudo ip link ens33 down  # down掉, 相当于ifup
sudo ip link ens33 up    # 启动网卡, 相当于 ifdown

ip link ls ens33  # 查看网卡的link信息
ip -s -d link ls ens33  # 查看网卡的link信息(更详细)
ip -s -s -d link ls ens33  # 查看网卡的link信息(更更详细)
ip link set dev ens33 mtu 1500  # 修改MTU
ip link set dev ens33  address 00:11:22:33:44:55  # 修改MAC

ip addr

1
2
3
4
5
6
ip addr    # ip a
ip addr show  # 跟上面没什么差别

ip addr add dev ens33 192.168.1.10/24  # 手动给网卡添加ip
ip addr del dev ens33 192.168.1.10/24  # 手动给网卡删除ip
ip addr fulsh dev ens33  # 清除网卡信息

ip route

1
2
3
4
ip route show  # 查看路由信息   ip route
ip route get 1.1.1.1   # 查看到达指定目的ip,计算要经过的路由
sudo ip route default via 192.168.1.2  # 添加默认路由(网关地址)
sudo ip route dev ens33 2.0.0.0/8 via 192.168.1.1 # 指定去往某个网络,都要经过1.1这个路由,并指定网卡进行转发

ip maddress

1
2
3
4
# 组播地址
ip maddress # 查看所有网卡都属于哪个组播地址
ip maddress ls ens33  # 查看指定网卡属于哪个组播地址
ip maddress add 33:33:00:00:00:01 dev ens33 # 把哪个网卡加入到某个组播地址

ip neighbor 查arp缓存

1
2
3
4
5
# 查看
ip neigh
ip -s -s neighbor show
# 手动绑定ip与mac地址(防止arp欺骗)  lladdr即逻辑链路层地址, perm是永久生效
ip neighbor add dev ens33 192.168.0.131 lladdr 00:11:22:33:44:55 nud perm

ip monitor 监视网络里面地址等解析的变化

1
2
ip monitor all
# 有着不同的状态

Nginx

  • 开源,轻量,快速,可扩展的Web服务器
  • Github, Netflix, Wordpress都基于Nginx
  • 但是可配置能力弱于Apache
  • 适用于大流量,高并发环境(稳定快速,占用资源少–C10K问题)
  • 在Top 1000个网站中使用率最高

Apache基于线程

  • 基于进程(运行中的文件就叫进程)消耗资源多
  • 同进程下的多线程共享内存(一损俱损)

Nginx使用事件驱动的架构

  • 新客户端请求时不创建新的进程/线程
  • 事件处理器处理请求任务
  • 更少的处理时间,更少的内存消耗

Apache与Nginx共用

  • Apache处理动态内容
  • Nginx处理静态内容

安装

1
2
3
sudo apt install nginx

# 配置文件在 /etc/nginx

配置文件

1
2
3
4
5
6
7
8
# /etc/nginx
# 主配置文件 nginx.conf

# 虚拟主机配置文件
sites-available
sites-enabled    # 启用的,是个链接

snippets    # 可以复用的片段
主配置文件
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# /etc/nginx/nginx.conf
user www-data;        # 用户
worker_processes auto;    # 进程数
include /etc/nginx/modules-enabled/*.conf;    # 引入的模块配置

events {
    worker_connections 768;  # 每个进程最大的并发连接数
    # multi_accept on;
}

http {
    sendfile on;    # 对内核 静态资源的访问速度(都要开着)
    tcp_nopush on;    # 优化了对tcp协议栈性能(优化了数据包的大小,多个小包变成大包再发)
    tcp_nodelay on;   # 与上面的参数相反(从发包的延时进行优化,来一个包就发)
    keepalive_timeout 65;        # 没一个TCP连接最大的保活的时间
    types_hash_max_size 2048;    # MIME类型镜头内容hash表大小

    ##
    # Virtual Host Configs
    ##
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}
虚拟主机配置文件

ip和端口一样,使用不同域名来指向不同站点

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# /etc/nginx/sites-available/    # 可用站点
# /etc/nginx/sites-enabled/      # 已启用站点

# /etc/nginx/sites-available/default
server{
    listen 80 default_server;    # 侦听的端口
    root /var/www/htmll;    # 根目录
    index index.html index.htm index.nginx-debian.html;    # 索引文件
    server_name www.xpsshuai.cn;    # 主机名(域名)
}

location / {    # 主url
    # First attempt to serve request as file, then
    # as directory, then fall back to displaying a 404.
    try_files $uri $uri/ =404;    # 资源没有就404
}

新建虚拟主机(Server Blocks)实例

Nginx中叫服务器块,但东西跟Apache中虚拟主机是一样的

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
sudo mkdir /var/www/qq.com
# 每个单独的Server Block一个配置文件
sudo cp /etc/nginx/sites-available/default  /etc/nginx/sites-available/qq.com
sudo vim /etc/nginx/sites-available/qq.com 
# 内容
server{
    listen 80;   # 因为这里都侦听80端口,所以为了和默认站点区分,要指定不同域名   
    server_name www.qqq.com;   
    root /var/www/qq.com;    
}
# 其他配置项可以取消注释自行配置
location ~ /\.ht {   # 这个建议启用,以..开头,以ht结尾的你我们就拒绝访问-->当然也可以增加更多策略
   deny all;
}


# 创建启用的符号链接(Apache是site2enable,这里没有专门的命令)
sudo ln -s /etc/nginx/sites-available/qq.com  /etc/nginx/sites-enabled/qq.com 
# 重启
sudo systemctl restart nginx

# 访问域名,就会访问到qq.com,因为请求中的host字段是不一样的

# 其他站点同上

Nginx支持PHP

WebServer本身只是提供资源的,必须配合php等脚本才能进行逻辑的运算

1.安装fastCGI process manager(FPM) –> 就能配合Nginx配合进行处理(Nginx把接收到的请求转发给php处理)

1
2
3
4
5
6
7
sudo apt install php-fpm   # 安装

# 查看位置  ls /var/run/php/
/var/run/php/php7.2-fpm.sock  # 进程名称(记住路径)
# 验证 
php -v
    

2.配置Nginx

1
2
3
4
5
6
# 修改配置  sudo vim /etc/nginx/sites-available/qq.com
location ~ \.php$ {   # 匹配所有访问.php的请求
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;    # 意思是: 把所有访问.php的拓展名的资源,都转发给这里pass的php进程
    }
# 还有,索引页面也要添加 index.php

3.配置PHP

1
2
3
4
5
6
7
8
# sudo vim /etc/php/7.2/fpm/php.ini
# 这里只简单讲几个配置
cgi.fix_pathinfo=0       # 必须修改为0, 安全
file_uploads = On         # 如果不需要就关掉,看自己需求
max_file_uploads = 20    # 限制单个文件上传大小
allow_url_fopen = On     # 是否允许文件包含(如果没业务需要,建议关闭)
allow_url_include = Off
memory_limit = 128M      # 指定内存大小(最小128M,看业务需求)

4.重新加载

1
2
3
4
sudo nginx -t
sudo systemctl reload nginx
# 重启php
sudo systemctl restart php7.2-fpm

5.重新访问php页面,查看是否正确解析

Nginx支持SSL

自签名证书 (自己测试或者不需要那么安全的情况下) –> 机密性和完整性可以保证,但是身份认证是不会被公网所信任的

1
2
3
4
5
# x509标准格式的, 私钥是绝对不能泄漏的, 后面是绑定的一个证书
sudo openssl req -x509 -days 365 -sha256 -newkey rsa:2048 -nodes -keyout /etc/ssl/private/qq.key -out /etc/ssl/certs/qq.pem
# 一旦域名绑定了证书,就必须通过这个域名来访问

# 若向CA证书颁发机构申请证书方法 同上Apache

服务块配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# sudo vim /etc/nginx/sites-available/qq.com
server {
     listen 443 ssl;        # 443端口是 ssl, 通过https访问
     server_name www.qqq.com;
     ssl_certificate /etc/ssl/certs/qq.pem;
     ssl_certificate_key /etc/ssl/private/qq.key;

     root /var/www/qq.com
}

# 重启服务
systemctl restart nginx


# 访问https://xxxxxx    会发现浏览器会提示证书不信任

Let’s encrypt 第三方的https的开源的免费证书颁发机构,向他来申请证书

1.安装

1
2
3
4
sudo add-apt-repository ppa:certbot/certbot  # 添加仓库
sudo apt update
sudo apt install cerbot    # 客户端程序(简化了申请流程)
sudo apt install python-cerbot-nginx

2.使用方法:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# 前提
域名正常解析、设置好虚拟主机

# 2.1申请证书 (--nginx意思是给nginx用的, -d是域名,还有子域名) , -m是管理员邮箱
sudo certbot --nginx -d example.com -d www.example.com -m admin@example.com

# 证书存放位置
/etc/letsencrypt/live

# 2.2修改自己配置文件中证书的位置
# sudo vim /etc/nginx/sites-available/qq.com
ssl_certificate


# 2.3 手动证书更新(因为默认证书有效期是90天)
sudo certbot renew --dry-run

# 2.4测试 查看证书状态(输入自己的域名) 可以查看到一些安全隐患等详细信息
https://www.ssllab.com/ssltest/
# ssl的信息扫描(不安全的地方)也可以使用自己本地的工具

Nginx反向代理

很多情况下,Nginx不是作为WebServer使用的,最常见的就是作为反向代理

首先说一下代理: 代理客户端访问外网服务器。代理是重新生成的请求(比如公司内部限制员工上网的场景) 反向代理: - 代理服务器对外提供服务,接受客户端请求 - 安全层过滤客户端恶意请求(云) - 可以放在防火墙外面,甚至放在云上(云WAF本质上就是反向代理, 请求通过DNS解析到云waf上,进行过滤)

  • Apache不适用于高并发,高负载环境
  • Nginx没有内建支持动态内容处理能力

结合Apache/Nginx的优势

  • Nginx接受入站请求和静态内容缓存,动态请求发给Apache
  • Apache完成动态内容处理
  • Nginx作为反向代理(动态请求转发给Apache)
  • Nginx放在WebServer前面,再将请求发给WebServer。然后服务端把数据通过Nginx向用户交付数据
  • 不仅减缓了Apache的流量压力,也进行了一定的安全过滤

Nginx实现反向代理

同一台服务器的流量转发

1.本机安装Apache

1
2
3
4
注意: 先停掉nginx的服务
systemctl stop nginx
再安装
sudo apt install apache2

2.修改Apache侦听端口

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
1.
# vim /etc/apache2/ports.conf
#让apache不占用80, 让nginx侦听80端口
 Listen 8080
<IfModule ssl_module>
   Listen 8443
</IfModule>
<IfModule mod_gnutls.c>
    Listen 8443
</IfModule>

2.修改apache虚拟站点默认侦听端口
vim /etc/apache2/sites-available/000-default.conf
也改为8080

3.重启服务
systemctl restart apache2

3.Nginx反向代理设置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# vim /etc/nginx/sites-available/default
#修改nginx配置,侦听80端口,然后动态部分的流量转发给apache,而静态文件还是放Nginx上读取(这里以php为例)
# 动态内容进行转发
location ~ \.php$ {
     include snippets/fastcgi-php.conf;
     # fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;   # 这里就不用nginx解析php了,用apache(配置在上面小结)
     proxy_pass  http://127.0.0.1:8080;  # 凡是php的动态内容都转发给本机的8080(即Apache)
     proxy_set_header X-Real-IP $remote_addr;  # 通常会添加一些代理请求头(便于区分)
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 这个头部虽然不是RFC标准,但是也是记录了经过了哪些代理地址
     proxy_set_header Host $host;
    proxy_set_header X-Forward-Proto $scheme;
    }
# 静态内容留给自己(增加一个location)      
location ~* \.(js|css|jpg|png|svg|html|htm)$ {
   expires 10d;   # 指定过期时间 10天
}

4.检查Nginx配置并重启

1
2
sudo nginx -t  # 检查配置语法
sudo systemctl restart nginx  # 重启

5.配置Apache支持php解析

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 1.安装
sudo apt install php7.2 libapache2-mod-php7.2   # mod-php模块
# 验证 
php -v

# 2.启用模块
a2enmod php7.2

# 3.索引文件
vim  /etc/apache2/mods-available/dir.conf       # 增加index.php

# 4.重启apache
sudo systemctl restart apache2

6.测试能否正常访问

多台服务器的Nginx反响代理,进行流量转发

实验环境:一台ubuntu安装apache, 两台虚拟机安装Nginx 客户端向第一台Nginx服务器发送请求,转发给第二台Nginx服务器,然后转发给最后一台Apache 链式代理

1.Nginx机器 N1 1.安装Nginx 2.配置(这里做实验就简单地用了默认的配置了)

1
2
3
4
# /etc/nginx/sites-available/default
location / {   # 所有发到我这里的请求都转发给N2
    proxy_pass http://192.168.0.104;
}

3.重启Nginx

2.Nginx机器 N2 1.安装Nginx 2.配置

1
2
3
4
# /etc/nginx/sites-available/default
location / {   # 所有发到我这里的请求都转发给N2
    proxy_pass http://192.168.0.105;
}

3.重启Nginx

3.Apache机器 A3 安装apache 然后客户端访问N1, 就会看到A3的页面

Nginx负载均衡

基于反向代理实现负载均衡

负载均衡: 前面放一个Nginx进行反向代理,后面放多个Apache作为WebServer

基本配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 定义一个服务器组(要转发到的目标组)
upstream srvs {  # upstream只是一个组的名称
    least_conn;        # 负载均衡方法规则 --最少连接数优先 (详细见下面)
    server 192.168.106:80  weight=1;  # server 是后面的一个WebServer(apache或Nginx)的地址, weight 是权重(越大接收的流量就越多)
    server 192.168.106:80  weight=2;  
}

# 配置
server {
    location / {
        proxy_pass http://srvs;   # 上面定义的组的名称(不需要被DNS解析,仅仅是一个标识)
    }
}

负载均衡方法

1
2
3
4
5
round-robin       # 论询
least_conn        # 最少连接数优先(已经建立的连接数)
least_time        # 响应速度最快
hash              # 基于请求的Hash值
ip_hash           # 基于ip地址的hash值(适用于需要会话保持的场景)

日志

1
2
/var/log/nginx/access.log
/var/log/nginx/error.log

Tomcat

Tomcat是由Apache组织开发的一个Servlet(Server Applet)容器

  • 实现对servlet, JSP, JAVA Socket等支持
  • 包含http服务器
  • 作为中间件使用
  • 可与Nginx结合使用(只用Tomcat的话, 抗压能力强)

servlet是优于CGI的方式的

安装 open jdk

一般tomcat和java配合较多 jdk是开发环境,jre是运行环境

1
sudo apt install default-jdk  #安装openjdk。 使用默认版本 或者指定openjdk-8-jdk      
安装 oracle jdk

安装

1
2
3
sudo apt install software-properties-common -y
sudo add-apt-repository ppa:webupd8team/java
sudo apt install oracle-java8-installer -y

java版本选择

1
2
3
4
sudo update-alternatives --config java
sudo update-alternatives --config javac

java --version

或者手动下载oracle jdk包

官方库安装tomcat
1
2
3
4
5
6
7
# ubuntu中收录的8
sudo apt install tomcat8
sudo apt install tomcat8-docs
sudo apt install tomcat8-admin
sudo apt install tomcat8-examples

# tomcat默认不是主要作为WebServer的,一般是配合Apache和Nginx,所以默认使用8080端口
手动安装tomcat

适用于指定具体版本 1.先安装jdk

1
2
3
4
5
6

sudo apt install default-jdk  #安装openjdk。 使用默认版本 或者指定openjdk-8-jdk   
# 验证
java --version

sudo useradd -m -U -d /opt/tomcat -s /bin/false tomcat       # 创建tomcat帐号(home放在opt下面)

2.再下载安装包

3.移动到/opt/tomcat目录

1
mv apache-tomcat-8.5.31 /opt/tomcat/

4.修改该文件递归的属主属组改为新建的tomcat用户

1
2
3
4
5
6
# 建议建立符号链接 
sudo ln -s /opt/tomcat/apache-tomcat-8.5.31 /opt/tomcat/latest  # 把新版本添加链接即可(版本更新之后不需要更改配置文件,配置文件都配置latest,而只需把latest修改指向即可)

sudo chown -R tomcat:/opt/tomcat
sudo chmod +x /opt/tomcat/latest/bin/*.sh
# sudo chmod +x /opt/tomcat/apache-tomcat-8.5.31/bin/*.sh
  1. 手动创建systemd管理文件(手动安装就没有systemd的后台管理文件) /etc/systemd/system/ sudo vim tomcat.service 配置内容如下

6.启动服务

1
2
3
4
5
6
7
# 重新reload
sudo systemctl daemon-reload
# 启动tomcat
sudo systemctl start tomcat
sudo systemctl status tomcat
# 设置开机启动启动
sudo systemctl enable tomcat

7.Web管理接口配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# http://ip:8080/manager/
# tomcat管理页面,默认是只允许本机访问的
## 1.若想开启,就需进行配置(这里指定允许某个ip访问)
sudo vim /opt/tomcat/latest/conf/tomcat-user.xml       # 自动安装tomcat后的路径在/etc
<tomcat-user>
    <role rolename="admin-gui"/>    # 定义两个角色
    <role rolename="manager-gui"/>
    <user username="admin" password="qwe123" roles="admin-gui, manager-gui"/>   # 定义用户
</tomcat-user>

## 2.指定登录主机
# sudo vim /opt/tomcat/latest/webapps/manager/META-INF/context.xml   #  自动安装tomcat后的路径自己找
如下图(懒得弄格式了)

# sudo vim /opt/tomcat/latest/webapps/host-manager/META-INF/context.xml
这是管理主机的配置文件

## 3.重启服务,然后测试
systemctl restart tomcat8
xxx:8080/manager/html        # 管理页面就可以部署war包等操
xxx:8080/host-manager/html
0%