Nginx

Nginx

简述

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文件

Nginx_第1张图片

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
一个文件对应一个网站 每个网站中的域名都不一样

autoindex 目录索引

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
		}
	}

访问控制

基于IP实现访问控制

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;
		}
	}

nginx七种状态 stub_stauts

Nginx_第2张图片
#状态监控模块
location = /nginx_status {
stub_status;
}

location优先级

Nginx_第3张图片

nginx 日志

访问日志 记录用户请求的信息
错误日志 记录所有错误信息,便于后期排查

    $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代理

正向与反向代理的区别

区别在于形式上服务的"对象"不一样
正向代理代理的对象是客户端,为客户端服务
反向代理代理的对象是服务端,为服务端服务**

反向代理模式 Nginx反向代理模块

反向代理模式					    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 “”;

Nginx七层负载均衡配置写法

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;
}

)

Nginx七层负载均衡根据用户请求的方式

根据用户请求的uri 进行调度

负载均衡

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;
	}
}

Nginx四层负载均衡

四层负载均衡基本概述

1.什么是四层负载均衡

  四层负载均衡基于传输层协议包来封装的(如: TCP/IP ) , 那我们前面使用到的七层是指的应用层,它的组装在四层基础之上,无论四层还是七层都是指的OSI网络模型。

Nginx_第4张图片
2.四层层负载均街应用场景

  1.四层负载均衡+七层负载均衡。4层可以保证7层负载均衡的高可用性。如.nginx就无法保证自己的服务高可用,需要依赖l
  vs或者keepalive.

Nginx_第5张图片
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;
}
}

Nginx_第6张图片
Nginx_第7张图片

Nginx +Tomcat 实现动静分离

[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 # 把默认配置注释

Nginx Rewrite 重写

Rewrite 基本概述

Rewrite 主要实现url地址重写,以及重定向,就是把传入Web的请求重定向到其他url的过程

Rewrite 使用场景

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证书

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

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高可用

什么是高可用,为什么要设计高可用

1.什么是高可用,为什么要设计高可用?
Nginx_第8张图片
为什么要设计高可用

一般指启动两台相同的业务系统, 当有一台故障,另外一台自动接管,对于用户而言是无感知的
专业解释: 减少系统不能提供服务的时间

2.如何保障系统的高可用
Nginx_第9张图片

keepalived如何实现高可用

keepalived需要借助一个VRRP协议来实现高可用.
VRRP 虚拟路由冗余协议

vrrp诞生的过程以及vrrp的原理

1.增加一个backup  (不同IP) 			不行   (所有人都需要修改网关地址)
2.增加一个backup (相同IP)			    不行   (所有人都需要情况arp缓存表)
3.给master和backup前面增加一个 vip和 vmac

Nginx_第10张图片

keepalived高可用使用场景

Nginx_第11张图片

keepalived高可用核心概念总结

1.选举  --->    优先级
2.抢占式   与   非抢占式
3.脑裂  --->    
fance仲裁   -->  关闭一台服务器的电源
软件方案    -->  漏洞百出

keepalived高可用安装与配置抢占式

状态	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.抓包查看切换的过程

高可用非抢占式

Nginx_第12张图片
Nginx_第13张图片
配置:
Nginx_第14张图片

#Master
		vrrp_instance VI_1 {
			state BACKUP
			priority 150
			nopreempt
		}

	#Backup
		vrrp_instance VI_1 {
			state BACKUP
			priority 100
			nopreempt
		}

keepalived高可用与Nginx集成

1.lb02安装nginx 官方的nginx
2.lb01拷贝所有nginx配置至lb02 —> lb02能正常的调度到后端的web集群
3.dns解析到VIP
4.测试网站打开是否正常

Nginx_第15张图片
如果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
			}
		}

keeplaived 如何使用

	vip 
	公网
	内网

1.搭建好集群
2.做好Keeplaived
3.准备防火墙|路由器, 接入交换,接入真实的公网
4.防火墙|路由器做端口映射   将80映射到VIP的80   ( 申请开放 )
5.DNS解析到对应的公网IP即可

Nginx_第16张图片
Nginx_第17张图片

你可能感兴趣的:(Nginx,Nginx)