Nginx是一个开源且高性能、可靠的Http Web服务、代理服务
开源: 直接获取源代码
高性能: 支持海量并发
可靠: 服务稳定
Nginx采用Epoll网络模型,Apache采用Select网络模型
Select:当用户发起一次请求,select模型就会进行一次遍历扫描,从而导致性能低下.
Epoll: 当用户发起请求,epool模型会直接进行处理,效率高效,并无连接限制.
Nginx应用场景
1.nginx web服务
2.nginx反向代理
3.nginx反向代理–>负载均衡
4.nginx反向代理–>缓存
5.nginx 静态加速
6.nginx动静分离
7.nginx 全栈https
1.源码安装 <–不考虑
2.epel源安装 <–不考虑,配置乱 容易出问题
3.官方源安装 <–极其推荐
Nginx官方安装
进程能够以什么样的方式访问一个文件, 取决运行这个进程的用户身份对这个文件拥有什么样的权限
[root@web01 ~]# cat /etc/nginx/nginx.conf
user nginx; # Nginx进程的运行用户身份
worker_processes 1; # Nginx运行的worker进程数
error_log /var/log/nginx/error.log warn; # Nginx错误日志存放的路径
pid /var/run/nginx.pid; # Nginx进程运行的PID号
events {
worker_connections 1024; #每个worker进程能接受的最大连接数
use epool;
}
http {
include /etc/nginx/mime.types;#文件扩展名和类型映射表
default_type application/octet-stream;#默认的文件类型
#日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#访问日志的路径 访问日志的存储格式是main格式, main格式在log_format中进行定义
access_log /var/log/nginx/access.log main;
sendfile on;#是否开启高效传输模式 on开启 off关闭
#tcp_nopush on;#减少网络报文段的数量
keepalive_timeout 65; #超时时间
#gzip on;#开启gzip压缩模式
include /etc/nginx/conf.d/*.conf; #包含 *.conf #包含的子配置项的位置和文件
#server<--定义网站
server {
listen 80; #监听80端口
server_name localhost; #网站的域名
location / { #匹配网站的uri
root /usr/share/nginx/html; #返回资源的具体路径
index index.html index.htm; #返回的具体资源名称
}
}
http <---负责请求与响应
* server1 <---定义一个具体的网站
* location <---根据用户请求的uri 进行匹配
* location2
* location3
* server2
* location <---根据用户请求的uri 进行匹配
* location2
* location3
* server....
/etc/nginx/conf.d/*.conf 是配置nginx文件
注释默认的配置, 新增一个网站的server配置 域名
[root@web01 conf.d]# gzip default.conf #压缩, 注释
[root@web01 conf.d]# zcat default.conf.gz #查看内容
[root@web01 conf.d]# cat game.oldxu.com.conf
server {
listen 80;
server_name game.oldxu.com;
location / {
root /code/;
index index.html;
}
}
[root@web01 conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@web01 code]# systemctl restart nginx
准备好代码的仓库位置
[root@web01 conf.d]# mkdir /code
[root@web01 conf.d]# cd /code/
上传代码
[root@web01 code]# git clone https://gitee.com/linex/battlecity.git
[root@web01 code]# mv battlecity/* ./
访问测试 配置WIndows Host劫持
访问流程
请求的url: http://html.oldxu.com /game/jianren/index.html
真实映射服务器的路径: /code3/game/jianren/index.html
nginx虚拟主机
虚拟主机 —> 在一台服务器上运行多个网站
虚拟主机实现方式有三种:
基于IP <–几乎不怎么使用
基于端口 <–
场景:内网环境,没有域名, 通过多个端口来区分不同的项目
基于域名: 必须用!
同一个IP,多个域名 Host: html.oldxu.com
一个文件对应一个网站 每个网站中的域名都不一样
server {
listen 80;
server_name mirror.lxx.com;
charset utf8; 设置字符集
location / {
root /code;
index index.html;
autoindex on; 自动索引(默认是关的状态)
autoindex_exact_size off; 精确的大小(默认是开的状态)
autoindex_localtime on;本地时间(默认是关的状态)
autoindex_format html;格式html
}
}
10.0.0.1 仅允许访问 /centos
10.0.0.100 拒绝访问 /ubuntu , 其他的IP都允许
[root@web01 ~]# cat /etc/nginx/conf.d/mirror.lxx.com.conf
server {
listen 80;
server_name mirror.lxx.com;
charset utf8;
root /code;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
autoindex_format html;
location / {
index index.html;
}
location /centos {
allow 10.0.0.1/32;
deny all;
}
location /ubuntu {
deny 10.0.0.100/32;
allow all;
}
}
[root@web01 ~]# yum install httpd-tools -y
[root@web01 ~]# htpasswd -bc /etc/nginx/auth_conf oldxu 123
[root@web01 ~]# cat /etc/nginx/conf.d/mirror.lxx.com.conf
server {
listen 80;
server_name mirror.lxx.com;
charset utf8;
root /code;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
autoindex_format html;
location / {
index index.html;
}
location /centos {
allow 10.0.0.1/32;
deny all;
}
location /ubuntu {
auth_basic "Lxx Site";
auth_basic_user_file /etc/nginx/auth_conf;
}
}
请求限制 limit_req
连接限制 limit_conn
[root@web01 ~]# cat /etc/nginx/conf.d/mirror.lxx.com.conf
limit_req_zone $binary_remote_addr zone=req_one:10m rate=1r/s;
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
listen 80;
server_name mirror.lxx.com;
charset utf8;
root /code;
limit_req zone=req_one burst=5 nodelay;
limit_conn addr 1;
limit_conn_status 504;
limit_rate 100k;
limit_rate_after 200m;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
autoindex_format html;
location / {
index index.html;
}
location /centos {
allow 10.0.0.1/32;
allow 10.0.0.7/32;
deny all;
}
}
限制web服务器请求数处理为1秒一个,缓存值为5、限制用户仅可同时下载一个文件。当下载超过100M则限制下载速度为500k。如果同时下载超过2个视频,则返回提示 “请联系lxx进行会员充值”。
[root@web01 ~]# cat /etc/nginx/conf.d/mirror.lxx.com.conf
limit_req_zone $binary_remote_addr zone=req_one:10m rate=1r/s;
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
listen 80;
server_name mirror.lxx.com;
charset utf8;
root /code;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
autoindex_format html;
location / {
index index.html;
}
location /download {
limit_req zone=req_one burst=5--可以缓存5个请求 nodelay;
limit_conn addr 2;
limit_conn_status 504;
limit_rate 300k;
limit_rate_after 100m;
}
#接收抛出504的异常,交给内部 @error_504 处理
error_page 504 @error_504;
location @error_504 {
#default_type text/html;
#return 200 "请充值会员";
#跳转到其他页面
#return 302 https://www.waitsun.com/xpay-html;
}
}
#状态监控模块
location = /nginx_status {
stub_status;
}
访问日志 记录用户请求的信息
错误日志 记录所有错误信息,便于后期排查
$remote_addr # 记录客户端IP地址 user --> web
$remote_user # 记录客户端用户名
$time_local # 记录通用的本地时间
$time_iso8601 # 记录ISO8601标准格式下的本地时间
$request # 记录请求的方法以及请求的http协议
$status # 记录请求状态码(用于定位错误信息)
$body_bytes_sent # 发送给客户端的资源字节数,不包括响应头的大小
$bytes_sent # 发送给客户端的总字节数
$msec # 日志写入时间。单位为秒,精度是毫秒。
$http_referer # 记录从哪个页面链接访问过来的
$http_user_agent # 记录客户端浏览器相关信息
$http_x_forwarded_for #记录客户端IP地址
$request_length # 请求的长度(包括请求行, 请求头和请求正文)。
$request_time # 请求花费的时间,单位为秒,精度毫秒
注:如果Nginx位于负载均衡器,nginx反向代理之后, web服务器无法直接获取到客 户端真实的IP地址。
# $remote_addr获取的是反向代理的IP地址。 反向代理服务器在转发请求的http头信息中,
# 增加X-Forwarded-For信息,用来记录客户端IP地址和客户端请求的服务器地址。
location = /favicon.ico {
return 200;
access_log off;
}
区别在于形式上服务的"对象"不一样
正向代理代理的对象是客户端,为客户端服务
反向代理代理的对象是服务端,为服务端服务**
反向代理模式 Nginx反向代理模块
http、websocket、https ngx_http_proxy_module
fastcgi ngx_http_fastcgi_module
uwsgi ngx_http_uwsgi_module
grpc ngx_http_v2_module
proxy_set_header Host $http_host;
# 用户请求的时候HOST的值是www.lxx.com,那么代理服务会像后端传递请求还是www.lxx.com
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 客户端通过代理服务访问后端服务,后端服务通过该变量会记录真实客户端地址
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_connect_timeout 30;
# nginxx代理与后端服务服务器连接超时时间
proxy_send_timeout 60;
# 后端服务器数据回传给nginx代理超时时间
proxy_read_timeout 60;
# nginx代理等待后端服务器响应的时间
proxy_buffering on;
# nginx会把后端返回的内容先放到缓冲区当中,然后在返回给客户端,边收边传,不是全部接受完再传给客户端
proxy_buffer_size 32k;
# 设置nginx代理保存用户头信息的缓冲区大小
proxy_buffers 4 128k;
**注**vim /etc/nginx/proxy_params
include proxy_params
# 缓冲区
调度算法 概述
轮询 按时间顺序逐一分配到不同的后端服务器(默认)
weight 加权轮询,weight值越大,分配到的访问几率越高 4 16G 8 64G
ip_hash 每个请求按访问IP的hash结果分配,这样来自同一IP的固定访问一个后端服务器
url_hash 按照访问URL的hash结果来分配请求,是每个URL定向到同一个后端服务器
least_conn 最少链接数,那个机器链接数少就分发
状态 概述
down 当前的server暂时不参与负载均衡
backup 预留的备份服务器
max_fails 允许请求失败的次数
fail_timeout 经过max_fails失败后, 服务暂停时间
max_conns 限制最大的接收连接数
补充;
keepalive 16; #最大的空闲连接数
keepalive_timeout 100s; #超时时间
keepalive_requests 50; #一个连接最大的请求数
#负载均衡与后端的连接和请求数的限制
#注意:需要配置 proxy_http_version proxy_set_header Connection “”;
upstream blog {
server 172.16.1.7:80;
server 172.16.1.8:80;
}
server {
listen 80;
server_name blog.lxx.com;
location / {
proxy_pass http://blog;
include proxy_params;
}
)
负载均衡
upstream pass_pool {
server 172.16.1.7:8080;
server 172.16.1.7:8081;
}
upstream user_pool {
server 172.16.1.8:8082;
server 172.16.1.8:8083;
}
server {
listen 80;
server_name agent.oldxu.com;
location /pass {
proxy_pass http://pass_pool;
include proxy_params;
}
location /user {
proxy_pass http://user_pool/;
include proxy_params;
}
}
注
proxy_pass 添加 / 和 不添加 / 区别?
#1.不添加/ 则会带上负载匹配location中的 uri 至后端
proxy_pass http://pass_pool;
agent.oldxu.com/pass —>http://172.16.1.7:8080/pass
#2.添加/ 则不会带上负载匹配location中的 uri
proxy_pass http://pass_pool/;
agent.oldxu.com/pass —>http://172.16.1.7:8080/;
详解
负载均衡
upstream pc_pool {
server 172.16.1.8:80;
}
upstream phone_pool {
server 172.16.1.7:80;
}
server {
listen 80;
server_name phone.oldxu.com;
location / {
default_type text/html;
#1.判断,如果是手机设备,则调度到phone_pool资源池
if ( $http_user_agent ~* "iphone|android|ipad") {
proxy_pass http://phone_pool;
}
#2.判断如果是IE,则返回一段话
if ( $http_user_agent ~* "MSIE" ) {
return 200 'Sorry IE....\nfirefox DownLoad.';
}
#3.如果上述判断不成立,则执行下面的proxy_pass
proxy_pass http://pc_pool;
include proxy_params;
}
}
四层负载均衡基本概述
1.什么是四层负载均衡
四层负载均衡基于传输层协议包来封装的(如: TCP/IP ) , 那我们前面使用到的七层是指的应用层,它的组装在四层基础之上,无论四层还是七层都是指的OSI网络模型。
1.四层负载均衡+七层负载均衡。4层可以保证7层负载均衡的高可用性。如.nginx就无法保证自己的服务高可用,需要依赖l
vs或者keepalive.
2.DNS+多机房+四层负载均衡+七层负载均衡
3.SOA松耦合架构
4.基于端口的转发
nginx是1.9版本以后才引入的四层负载均衡
stream模块实现,但stream不能出现在http层
配置语法:
stream {
upstream backend {
hash $remote addr consistent; L
server backend1 . example. com: 12345 weight=5;
server 127.0.0.1:12345 max fails-3 fail timeout=30s;server unix: 1 tmp/backend3;
}
server {
listen 12345;
proxy connect t imeout 1 s;proxy timeout 3s;proxy pass backend;
}
}
[root@web01 ~]# yum install -y tomcat
[root@web01 ~]# mkdir /usr/share/tomcat/webapps/ROOT
[root@web01 ~]# cd /usr/share/tomcat/webapps/ROOT
[root@web01 ~]# vim index.jsp
[root@web01 ~]# vim index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
<head>
<title>Nginx+Tomcat动静分离</title>
</head>
<body>
<%
Random rand = new Random();
out.println("动态资源
");
out.println(rand.nextInt(99)+100);
%>
<h2>静态图片</h2>
<img src="nginx.png" />
</body>
</html>
下载静态资源
[root@web01 ~]# wget http://nginx.org/nginx.png
#.关闭与8080相关的程序
[root@web01 ~]# cd /etc/nginx/conf.d/
[root@web01 ~]# gzip agent.lxx.com.conf
#启动Tomcat
[root@web01 ~]# systemctl start tomcat
检查Tomcat
[root@web01 ~]# netstat -lntp|grep java
tcp6 0 0 :::8009 :::* LISTEN 9409/java
tcp6 0 0 :::8080 :::* LISTEN 9409/java
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 9409/java
浏览器测试校验
配置Nginx动静分离
[root@web01 ~]# cat /etc/nginx/conf.d/ds.lxx.com.conf
server {
listen 80;
server_name ds.lxx.com;
location / {
proxy_pass http://127.0.0.1:8080;
}
location ~* \.(png|jpg|gif)$ {
root /images;
expires 1d;
}
}
[root@web01 ~]# nginx -t
[root@web01 ~]# systemctl restart nginx
[root@web01 ~]# mkdir /images
[root@web01 ~]# cd /images/
[root@web01 ~]# rz
[root@web01 ~]# systemctl restart nginx
1.ip_hash
upstream php {
ip_hash;
server 172.16.1.7:80;
server 172.16.1.8:80;
}
2.会话共享—>redis
redis安装 配置 启动
[root@db01 ~]# yum install redis -y
[root@db01 ~]# sed -i '/^bind/c bind 127.0.0.1 172.16.1.51' /etc/redis.conf
[root@db01 ~]# systemctl start redis
[root@db01 ~]# systemctl enable redis
php应用服务接入redis ( session -->存储—>redis )
cat /etc/php-zts.d/redis.ini
; Enable redis extension module
extension = redis.so
; phpredis can be used to store PHP sessions.
; To do this, uncomment and configure below
;session.save_handler = redis
;session.save_path = "tcp://host1:6379?weight=1, tcp://host2:6379?weight=2&timeout=2.5, tcp://host3:6379?weight=2"
[root@web02 code]# vim /etc/php.ini
session.save_handler = redis
session.save_path = "tcp://172.16.1.51:6379?weight=1&timeout=2.5"
[root@web02 code]# vim /etc/php-fpm.d/www.conf
;php_value[session.save_handler] = files
;php_value[session.save_path] = /var/lib/php/session
[root@web02 code]# systemctl restart php-fpm
vim /php/phpmyadmin/config.inc.php
$cfg['Servers'][$i]['host'] = '172.16.1.51';
vim /etc/php-fpm.d/www.conf
;php_value[session.save_handler] = files # 把默认配置注释
;php_value[session.save_path] = /var/lib/php/session # 把默认配置注释
Rewrite 主要实现url地址重写,以及重定向,就是把传入Web的请求重定向到其他url的过程
1 地址跳转:用户访问liuxiaoxi.xyz/top 这个url时,将其定向至一个新的域名top.liuxiaoxi.xyz
2 协议跳转:用户通过http协议请求网站时,将其重新跳转至https协议方式
3 伪静态 :将动态页面显示为静态页面方式的一种技术,便于搜索引擎的录入,同时减少动态url地址对外暴露过多的参数,提升更高的安全性
4 搜索引擎:SEO优化依赖于url路径,好记的url便于支持搜索引擎录入
需求1: 将用户请求url.oldxu.zh—> /code/zh
需求2: 将用户请求url.oldxu.jp —> /code/jp
需求: 根据用户浏览器使用的语言,自动判断并跳转到不同的语言站点。
[root@web01 conf.d]# cat url.oldxu.com.conf
server {
listen 80;
server_name url.oldxu.zh url.oldxu.jp;
#如果请求的域名携带了zh 变量名随意
if ( $http_host ~* "zh" ) {
set $domain "zh";
}
#如果请求的域名携带了jp
if ( $http_host ~* "jp" ) {
set $domain "jp";
}
root /url/$domain;
location / {
index index.html;
}
}
需求: 根据用户浏览器使用的语言,自动判断并跳转到不同的语言站点。
url.oldxu.com
中文: /code/zh
English: /code/en
server {
listen 80;
server_name url.oldxu.com;
if ( $http_accept_language ~* "zh" ) {
set $doamin "zh";
}
if ( $http_accept_language ~* "en" ) {
set $doamin "en";
}
root /url/$doamin;
location / {
index index.html;
}
}
[root@web01 conf.d]# cat url.oldxu.com.conf
server {
listen 80;
server_name url.oldxu.com;
root /url;
default_type text/html;
if ( $request_uri ~ 'a1=3567' ) {
#if ( $request_uri ~ 'a1=\d{6}' ) {
#proxy_pass http://10.16.3.5:8080;
return 200 "ok!!";
}
location / {
index index.html;
}
}
注:return:
1.返回字符串 显示在浏览器上
2.返回状态码 403 404
3.返回url地址 跳转到一个新的url地址
return 200 "ok!!"; json
return 500;
return 302 https://www.xuliangwei.com;
Rewrite 标记Flag
flag | |
---|---|
last | 本条规则匹配完成后,停止匹配,不在匹配后面的规则 |
break | 本条规则匹配完成后,停止匹配,不在匹配后面的规则 |
redirect | 返回302临时重定向,地址会显示跳转后的地址 |
permanent | 返回301永久重定向,地址栏会显示跳转后的地址 |
url.oldxu.com ---> url.oldxu.com/m
[root@web01 conf.d]# cat url.oldxu.com.conf
server {
listen 80;
server_name url.oldxu.com;
root /url;
if ( $http_user_agent ~* "android|iphone|ipad" ) {
rewrite ^/$ /m redirect;
}
location / {
index index.html;
}
}
url.oldxu.com ---> m.oldxu.com
[root@web01 conf.d]# cat url.oldxu.com.conf
server {
listen 80;
server_name url.oldxu.com;
root /url;
if ( $http_user_agent ~* "android|iphone|ipad" ) {
rewrite ^/$ http://m.oldxu.com redirect;
}
location / {
index index.html;
}
}
server {
listen 80;
server_name m.oldxu.com;
root /url/m;
location / {
index index.html;
}
}
需求: 用户通过http协议请求,能自动跳转至https协议。
root@web01 conf.d]# cat url.oldxu.com.conf
server {
listen 80;
server_name url.oldxu.com;
#rewrite ^(.*)$ https://$http_host$1 redirect;
return 302 https://$http_host$request_uri;
}
[root@web01 conf.d]# curl -I http://url.oldxu.com/test1232432543.html
需求: 网站在维护过程中,希望用户访问所有网站重定向至一个维护页面。
[root@web01 conf.d]# cat url.oldxu.com.conf
server {
listen 80;
server_name url.oldxu.com;
root /code;
rewrite ^(.*)$ /wh.png break;
location / {
index index.html;
}
location /admin {
proxy_pass http://127.0.0.1:9000;
}
}
需求: 公司网站在停机维护时,指定的IP能够正常访问,其他的IP跳转到维护页
10.0.0.1 内部服务器 --> 成功
10.0.0.100 正常用户 --> 失败
[root@web01 conf.d]# cat url.oldxu.com.conf
server {
listen 80;
server_name url.oldxu.com;
root /url;
#初始值为0
set $ip 0;
#如果是内部IP,则为1
if ( $remote_addr ~ "10.0.0.1|10.0.0.100|10.0.0.200" ) {
set $ip 1;
}
#判断ip变量如果为0则跳转,不为0则不跳转.
if ( $ip = "0" ) {
rewrite ^(.*)$ /wh.png break;
}
location / {
index index.html;
}
location /admin {
proxy_pass http://127.0.0.1:9000;
}
}
https证书颁发流程:
1.运维-->申请证书
2.CA机构校验身份
3.CA颁发证书(留档) ---> 颁发给 运维 ( 公钥 私钥 )
4.运维拿到证书--->部署到web站点上
5.浏览器--->通过 https 方式 请求 web服务器
6.web服务器返回 公钥 给 浏览器
7.浏览器 校验 证书的 有效性 合法性 ---> CA 机构
8.浏览器生成一个随机数 使用 服务器的公钥 加密 ---> 传输给 web服务器
9.web服务器使用配套的私钥解密
10.web服务器通过浏览器发送过来的随机数 生成一个 秘钥
11.web发送加密后的内容 --->
12.浏览器通过随机数解密
注:
dv #个人使用,申请免费
ov #企业使用
ev #企业使用, 显示友好,加密强度更大
保护证书个数是什么意思
保护证书个数是什么意思?
oldboyedu.com
保护一个域名下面的一个子域名 ( 个人 )
www.oldboyedu.com
保护一个域名下面的5个子域名
m.oldboyedu.com
cdn.oldboyedu.com
test.oldboyedu.com
down.oldboyedu.com
sz.oldboyedu.com
通配符oldboyedu.com ( 企业 )
bj.oldboyedu.com
sh.oldboyedu.com
1.创建一个存放证书的目录
[root@web01 conf.d]# mkdir /etc/nginx/ssl_key
[root@web01 conf.d]# cd /etc/nginx/ssl_key/
2.创建私钥证书( 无效的,不用care )
openssl req -nodes -newkey rsa:2048 -keyout server.key -out server.csr -subj "/C=/ST=/L=/O=/OU=/CN=wuxing"
openssl x509 -req -sha256 -days 36500 -in server.csr -signkey server.key -out server.crt
3.配置一个https的网站 ( 只能通过https访问 )
[root@web01 conf.d]# cat /etc/nginx/conf.d/s.oldxu.com.conf
server {
listen 443 ssl;
server_name s.oldxu.com;
ssl_certificate ssl_key/server.crt;
ssl_certificate_key ssl_key/server.key;
charset utf8;
root /code;
location / {
index index.html;
}
}
4.将http的请求过渡到https
[root@web01 conf.d]# cat /etc/nginx/conf.d/s.oldxu.com.conf
server {
listen 443 ssl;
server_name s.oldxu.com;
ssl_certificate ssl_key/server.crt;
ssl_certificate_key ssl_key/server.key;
charset utf8;
root /code;
location / {
index index.html;
}
}
server {
listen 80;
server_name s.oldxu.com;
return 302 https://$http_host$request_uri;
}
-------------------------------------------------------------------------
web01
[root@web01 conf.d]# cat ssl.oldxu.com.conf
server {
listen 80;
server_name ssl.oldxu.com;
root /code;
location / {
index index.html;
}
}
web02
[root@web02 conf.d]# cat ssl.oldxu.com.conf
server {
listen 80;
server_name ssl.oldxu.com;
root /code;
location / {
index index.html;
}
}
lb01
[root@lb01 conf.d]# cat proxy_ssl.oldxu.com.conf
upstream ssl {
server 172.16.1.7:80;
server 172.16.1.8:80;
}
server {
listen 443 ssl;
server_name ssl.oldxu.com;
ssl_certificate ssl_key/server.crt;
ssl_certificate_key ssl_key/server.key;
location / {
proxy_pass http://ssl;
include proxy_params;
}
}
server {
listen 80;
server_name ssl.oldxu.com;
return 302 https://$http_host$request_uri;
}
注:
1.单独测试后端节点是否是正常 A B C …
2.接入负载均衡 检查是否正常
3.配置Http 为 HTTPS 功能
问题:
1.需要点击浏览器右上角,运行不安全的脚本
2.需要配置nginx代理php参数 fastcgi_param HTTPS on; <–应用节点配置 location ~ .php$
3.由于此前是使用的http协议, 需要登录后台将http修改为https
4.用户如何直接访问http 服务端强转https
1 模拟银行需求
需求:
1.用户访问www.oldxu.com网站以及网站其他页面都为http协议
2.当用户访问/login时, 则跳转 https://s.oldxu.com提供登录
10.0.0.8 s.oldxu.com
10.0.0.7 www.oldxu.com
[root@web02 conf.d]# cat s.oldxu.com.conf
server {
listen 443 ssl;
ssl_certificate ssl_key/server.crt;
ssl_certificate_key ssl_key/server.key;
server_name s.oldxu.com;
root /code;
location / {
index index.html;
}
}
[root@web01 conf.d]# cat www.oldxu.com.conf
server {
listen 80;
server_name www.oldxu.com;
root /code;
location / {
index index.html;
}
location /login {
return 302 https://s.oldxu.com;
}
}
2 示例
需求: 希望用户访问网站的所有Url走Https协议,但访问s.oldxu.com/abc时能支持Http|https协议?
server {
listen 443 ssl;
ssl_certificate ssl_key/server.crt;
ssl_certificate_key ssl_key/server.key;
server_name s.oldxu.com;
root /code;
location / {
index index.html;
}
}
server {
listen 80;
server_name s.oldxu.com;
if ( $request_uri != '/abc') {
return 302 https://$http_host$request_uri;
}
}
[root@web01 conf.d]# cat s.oldxu.com.conf
server {
listen 443 ssl;
server_name s.oldxu.com;
ssl_certificate ssl_key/1524377920931.pem;
ssl_certificate_key ssl_key/1524377920931.key;
ssl_session_cache shared:SSL:10m; #在建立完ssl握手后如果断开连接,在session_timeout时间内再次连接,是不需要在次建立握手,可以复用之前的连接
ssl_session_timeout 1440m; #ssl连接断开后的超时时间(24小时)
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #使用的TLS版本协议
ssl_prefer_server_ciphers on; #Nginx决定使用哪些协议与浏览器进行通讯
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #配置加密套间
location / {
root /code;
index index.html index.htm;
}
}
#http-https
server {
listen 80;
server_name s.oldxu.com;
return 302 https://$server_name$request_uri;
}
一般指启动两台相同的业务系统, 当有一台故障,另外一台自动接管,对于用户而言是无感知的
专业解释: 减少系统不能提供服务的时间
keepalived需要借助一个VRRP协议来实现高可用.
VRRP 虚拟路由冗余协议
1.增加一个backup (不同IP) 不行 (所有人都需要修改网关地址)
2.增加一个backup (相同IP) 不行 (所有人都需要情况arp缓存表)
3.给master和backup前面增加一个 vip和 vmac
1.选举 ---> 优先级
2.抢占式 与 非抢占式
3.脑裂 --->
fance仲裁 --> 关闭一台服务器的电源
软件方案 --> 漏洞百出
状态 IP 角色
节点1 10.0.0.5 Master
节点2 10.0.0.6 Backup
VIP 10.0.0.3
1.安装keeplaived
[root@lb01 ~]# yum install keepalived -y
[root@lb02 ~]# yum install keepalived -y
2.配置keeplaived
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
router_id lb01
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 50
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
}
[root@lb02 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
router_id lb02
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 50
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
}
3.启动keeplaived (所有机器都需要执行)
[root@lb02 ~]# systemctl enable keepalived.service
[root@lb02 ~]# systemctl start keepalived.service
4.keepalived高可用地址漂移测试
1.停止keeplaived就能测试是否正常漂移虚拟IP地址 VIp
2.停止后,我们可以使用 ip addr|grep 10.0.0.3 检查虚拟IP在哪台主机上
3.使用windows持续ping 虚拟VIP -->模拟keepalived故障 ( arp )
4.抓包查看切换的过程
#Master
vrrp_instance VI_1 {
state BACKUP
priority 150
nopreempt
}
#Backup
vrrp_instance VI_1 {
state BACKUP
priority 100
nopreempt
}
1.lb02安装nginx 官方的nginx
2.lb01拷贝所有nginx配置至lb02 —> lb02能正常的调度到后端的web集群
3.dns解析到VIP
4.测试网站打开是否正常
如果nginx故障了? 故障会转移? —>不会
1.脚本怎么写? 监控Nginx是否存活,不存活则kill掉Keeplaived
1.1 检查Nginx进程 ps
1.2 检查端口存活状态 80 443 netstat
1.3 检查网站是否返回输出结果 curl
[root@lb01 conf.d]# cat /scripts/check_web.sh
#!/usr/bin/bash
#1.检查nginx进程数量
Nginx_Process_Number=$(ps -C nginx --no-header|wc -l)
#2.判断nginx进程数量
if [ $Nginx_Process_Number -lt 2 ];then
#3.如果进程小于2,则尝试重新启动一次Nginx,并等待2s
systemctl restart nginx &>/dev/null
sleep 2
Nginx_Process_Number=$(ps -C nginx --no-header|wc -l)
#4.如果再次执行进程还是小于2,则直接kill掉keeplaived
if [ $Nginx_Process_Number -lt 2 ];then
pkill keepalived
fi
fi
[root@lb01 conf.d]# chmod +x /scripts/check_web.sh
脚本放哪
定时任务 ( 分钟级 )
sleep命令 ( 秒级 ) --->丢后台 ---> screen
1.yum install screen -y
2.开启一个新的会话---> screen -S Name
3.在screen中使用ctrl+a+d 回到Bash窗口
4.screen -list ---> screen -r pid|name
注意:不能再screen窗口中执行ctrl+d的操作
keeplaived 调脚本 ( 秒 | 分 )
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
router_id LVS_01
}
#1.每5秒执行一次脚本, 脚本执行内容不能超过5秒,否则会被中断再次重新运行脚本
vrrp_script check_web {
script "/scripts/check_web.sh"
interval 5
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 50
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
#2.调用并运行该脚本
track_script {
check_web
}
}
vip
公网
内网
1.搭建好集群
2.做好Keeplaived
3.准备防火墙|路由器, 接入交换,接入真实的公网
4.防火墙|路由器做端口映射 将80映射到VIP的80 ( 申请开放 )
5.DNS解析到对应的公网IP即可