从0到1学运维:欢迎订阅专栏~,永久更新。帮助大家速成运维基本功~
往期文章:
2-Redis服务端客户端使用与主从集群
一:添加ssl证书
为什么要添加ssl证书?
超文本传输安全协议(Hyper Text Transfer Protocol over Secure Socket Layer,HTTPS),是以安全为目标的HTTP通道,简单来说就是HTTP的安全版。HTTPS由两个部分组成:HTTP + SSL / TLS,在HTTP基础上又加了一层处理加密信息的模块,服务端和客户端的信息传输都会通过TLS进行加密,传输的数据都是加密后的数据。
为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。
SSL证书是一种数字证书,它使用Secure Socket Layer 协议在浏览器和 Web 服务器之间建立一条安全通道,从而实现数据信息在客户端和服务器之间的加密传输,保证双方传递信息的安全性,不可被第三方窃听。而且用户可以通过服务器证书验证他所访问的网站是否真实可靠。
加密的HTTP传输通道,浏览器访问格式为:https://url,其基于HTTP+TLS,现被广泛应用于互联网上安全敏感的通信,例如安全登录、订单交易、支付结算等方面。
HTTPS和HTTP的区别,超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息。HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此HTTP协议不适合传输一些敏感信息,比如信用卡号、密码等。
HTTPS加密、解密、验证完整过程,如图
如下为HTTPS传输八个步骤内容详解:
(1) 客户端发起HTTPS请求,用户在浏览器里输入https网址,然后连接到Nginx Server的443端口。
(2) 服务器端采用HTTPS协议有一套数字证书,该证书可以自行配置,也可以向证书管理组织去申请,该证书其本质是公钥和私钥。
(3) 将公钥传送证书传递给客户端,证书包含了很多信息,例如如证书的颁发机构,过期时间、网址、公钥等等。
(4) 客户端解析证书,由客户端的TLS来完成,首先会验证公钥是否有效,比如颁发机构,过期时间等等,如果发现异常,则会弹出警告框,提示证书存在问题。如果证书没有问题,就会生成一个随机值。然后用证书对该随机值进行加密。
(5) 将证书加密后的随机值传送至服务器,让服务端获取该随机值,后续客户端和服务端的通信可以通过该随机值来进行加密解密。
(6) 服务端用私钥解密后,得到了客户端传过来的随机值,然后把内容通过该值进行对称加密。
(7) 服务器端将用私钥加密后的信息发给客户端。
(8) 客户端用之前生成的私钥来解密服务端发送过来的信息,获取解密后的内容。
至于证书的申请,大家自己在网上购买或者阿里云腾讯云之类的白嫖,网上有相关教程。这里就不赘述了。总之最后会得到两个文件,大概这样子
二:之后编写nginx.conf文件
rver {
listen 443 ssl;
server_name www.xxxx.com xxx.xxx.xxx.xxx(填你的域名和对应的IP);
ssl_certificate www.xxxx.pem
ssl_certificate_key www.xxxx.key
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root xxx/xxx/xxx/xxx/...(填你的发布目录);
index index.html index.htm;
}
}
然后重启nginx,访问web网页
三:核心配置文件说明(nginx.conf)
#定义Nginx运行的用户和用户组
user www www;
#启动进程,通常设置成和cpu的数量相等
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
#为每个进程分配cpu,上例中将8个进程分配到8个cpu,当然可以写多个,或者将一个进程分配到多个cpu。
worker_rlimit_nofile 102400;
#该指令是当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n的值保持一致。
#全局错误日志及PID文件
error_log /usr/local/nginx/logs/error.log;
vents {
use epoll;
#epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能.
worker_connections 102400;
#单个后台worker process进程的最大并发链接数 (最大连接数=连接数*进程数)
multi_accept on;
#尽可能多的接受请求.
}
#设定http服务器,利用它的反向代理功能提供负载均衡支持
http {
#设定mime类型,类型由mime.type文件定义
include mime.types;
default_type application/octet-stream;
#设定日志格式
access_log /usr/local/nginx/log/nginx/access.log;
sendfile on;
#sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用必须设为 on
#如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime。
#autoindex on;
#开启目录列表访问,合适下载服务器,默认关闭。
tcp_nopush on;
#防止网络阻塞
#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://jfedu_www; #请求转向后端定义的均衡模块
}
# 定义错误提示页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
四:nginx location详解
Rewirte规则也称为规则重写,主要功能是实现浏览器访问HTTP URL的跳转,其正则表达式是基于Perl语言。通常而言,几乎所有的WEB服务器均可以支持URL重写。Rewrite URL规则重写的用途:
q 对搜索引擎优化(Search Engine Optimization,SEO)友好,利于搜索引擎抓取网站页面;
q 隐藏网站URL真实地址,浏览器显示更加美观;
q 网站变更升级,可以基于Rewrite临时重定向到其他页面。
Nginx Rewrite规则使用中有三个概念需要理解,分别是:Rewrite结尾标识符、Rewrite规则常用表达式、Nginx Rewrite变量,如下为三个概念的详解:
- Nginx Rewrite结尾标识符,用于Rewrite规则末尾,表示规则的执行属性。
last :相当于Apache里的(L)标记,表示完成rewrite匹配; break:本条规则匹配完成后,终止匹配,不再匹配后面的规则。 redirect:返回302临时重定向,浏览器地址会显示跳转后的URL地址。 permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址。 其中last和break用来实现URL重写时,浏览器地址栏URL地址不变。2 |
2.Nginx Rewrite规则常用表达式,主要用于匹配参数、字符串及过滤设置。
. 匹配任何单字符; [word] 匹配字符串:word; [^word] 不匹配字符串:word; jfedu|jfteach 可选择的字符串:jfedu|jfteach; ? 匹配0到1个字符; * 匹配0到多个字符; + 匹配1到多个字符; ^ 字符串开始标志; $ 字符串结束标志; \n 转义符标志。 |
3.Nginx Rewrite变量,常用于匹配HTTP请求头信息、浏览器主机名、URL等。
HTTP headers:HTTP_USER_AGENT, HTTP_REFERER, HTTP_COOKIE, HTTP_HOST, HTTP_ACCEPT; connection & request: REMOTE_ADDR, QUERY_STRING; server internals: DOCUMENT_ROOT, SERVER_PORT, SERVER_PROTOCOL; system stuff: TIME_YEAR, TIME_MON, TIME_DAY。 详解如下: HTTP_USER_AGENT 用户使用的代理,例如浏览器; HTTP_REFERER 告知服务器,从哪个页面来访问的; HTTP_COOKIE 客户端缓存,主要用于存储用户名和密码等信息; HTTP_HOST 匹配服务器ServerName域名; HTTP_ACCEPT 客户端的浏览器支持的MIME类型; REMOTE_ADDR 客户端的IP地址 QUERY_STRING URL中访问的字符串; DOCUMENT_ROOT 服务器发布目录; SERVER_PORT 服务器端口; SERVER_PROTOCOL 服务器端协议; TIME_YEAR 年; TIME_MON 月; TIME_DAY 日; |
4.Nginx Rewrite以下配置均配置在nginx.conf或者vhosts.conf中,企业中常用的Nginx Rewrite案例如下:
1.将yuhan.net跳转至www.yuhan.net。
if ($host = 'yuhan.net' ) { rewrite ^/(.*)$ http://www.yuhan.net/$1 permanent; } |
2.访问www.yuhan.net跳转www.test.com/new.index.html。
rewrite ^/$ http://www.test.com/index01.html permanent; |
3.访问/yuhan/test01/跳转至/newindex.html,浏览器地址不变。
rewrite ^/yuhan/test01/$ /newindex.html last; |
4.多域名跳转到www.yuhan.net。
if ($host != ‘www.yuhan.net’ ) { rewrite ^/(.*)$ http://www.yuhan.net/$1 permanent; } |
5.访问文件和目录不存在跳转至index.php。
if ( !-e $request_filename ) { rewrite ^/(.*)$ /index.php last; } |
6.目录对换 /xxxx/123456 ====> /xxxx?id=123456。
rewrite ^/(.+)/(\d+) /$1?id=$2 last; |
7.判断浏览器User Agent跳转。
if( $http_user_agent ~ MSIE) { rewrite ^(.*)$ /ie/$1 break; } |
8.禁止访问以.sh,.flv,.mp3为文件后缀名的文件。
location ~ .*\.(sh|flv|mp3)$ { return 403; } |
9.将移动用户访问跳转至移动端。
if ( $http_user_agent ~* "(Android)|(iPhone)|(Mobile)|(WAP)|(UCWEB)" ) { rewrite ^/$ http://m.jfedu.net/ permanent; } |
10.匹配URL访问字符串跳转。
if ($args ~* tid=13){ return 404; } |
11.访问/10690/jfedu/123跳转至/index.php?tid/10690/items=123,[0-9]表示任意一个数字,+表示多个,(.+)表示任何多个字符。
rewrite ^/([0-9]+)/jfedu/(.+)$ /index.php?tid/$1/items=$2 last; |