- Nginx(Enginex)是一个高性能的HTTP和反向代理web服务器m, 同时也提供IMAP/POP3/SMTP服务.
- 主要功能是反向代理.
- 通过配置文件可以实现集群和负载均衡.
反向代理
常见的web服务器
- MS IIS asp.net
- Weblogic、Jboss 传统行业,ERP(企业资源计划)/物流/电信/金融
- Tomcat、Jetty J2EE
- Apache、Nginx 静态服务,反向代理
- Netty 高性能服务器编程
什么是正向代理
- 客户端请求目标服务器之间的一个代理服务器(运营商).
- 请求会先经过代理服务器,然后再转发请求到目标服务器,获得的内容最后响应给客户端.
- 正向代理, 帮助内网client访问外网的server.
- 正向代理即是客户端代理, 代理客户端, 服务端不知道实际发起请求的客户端.
用途:
- 访问原来不能访问的资源, 例如谷歌。
- 可以做缓存, 加速访问资源。
- 对客户端访问授权, 上网认证。
- 代理可以记录用户访问记录, 对外隐藏用户信息。
什么是反向代理
- 用户请求目标服务器, 由代理服务器决定访问哪个ip.
- 即代理外网的请求转发到内网的服务器, 从外到内.
- 反向代理即是服务端代理, 代理服务端, 客户端不知道实际提供服务的服务端.
用途:
- 保证内网安全, 阻止web攻击, 大型web网站, 一般反向代理服务器作为公网访问地址, 而web服务是内网.
- 负载均衡, 通过反向代理服务器来优化网站的负载.
反向代理之路由
Nginx安装与运行
基于Manjaro安装
# 安装gcc
pacman -S gcc
gcc -v
# 安装pcre库,pcre是一个perl库,包括perl兼容的正则表达式库,nginx的http模块使用pcre来解析正则表达式
pacman -S pcre
# 安装zlib库 zlib库提供了很多种压缩和解压缩方式nginx使用zlib对http包的内容进行gzip
pacman -S zlib
# 安装openssl openssl是web安全通信的基石.SSL安全加密的套接字协议,用于HTTP安全传输,也就是https
pacman -S openssl
# 下载nginx源码包
wget http://nginx.org/download/nginx-1.18.0.tar.gz
# 解压到指定目录
tar -zxvf nginx-1.18.0.tar.gz
# 创建nginx临时目录
mkdir /var/temp/nginx -p
# 进入目录编译安装
./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi \
--with-http_ssl_module
--with-http_v2_module
make
make install
# 修改配置文件
vim /usr/local/nginx/conf/nginx.conf
# 启动服务
cd /usr/local/nginx/sbin
./nginx
# 查看是否启动成功
ps -ef | grep nginx
nginx 安装参数说明
command | comment |
---|---|
–prefix | 安装目录 |
–pid-path | 指向nginx的pid |
–lock-path | 锁定安装文件,防止被恶意篡改 |
–error-log-path | 错误日志 |
–http-log-path | http日志 |
–with-http_gzip_static_module | 启用gzip模块,在线实时压缩输出数据流 |
–http-client-body-temp-path | 设定客户端请求的临时目录 |
–http-proxy-temp-path | 设定http代理临时目录 |
–http-fastcgi-temp-path | 设定fastcgi临时目录 |
–http-uwsgi-temp-path | 设定uwsgi临时目录 |
–http-scgi-temp-path | 设定scgi临时目录 |
nginx.conf配置文件
- main 全局配置
- event 配置工作模式以及连接数
- http http模块相关配置
- server 虚拟主机配置,可以多个
- location 路由规则,表达式
- upstream 集群,内网服务器
- server 虚拟主机配置,可以多个
- http http模块相关配置
- event 配置工作模式以及连接数
# 工作进程是由哪一个用户执行
#user nobody;
# n - 1, 例如八核就设置7个
worker_processes 5;
# 日志级别 debug info notice warn error crit
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
# 进程id
#pid logs/nginx.pid;
events {
# 默认使用
use epoll
# 每个worker允许连接的最大连接数
worker_connections 10240;
}
http {
# 导入文件 为了提高可读性
include mime.types;
default_type application/octet-stream;
# 日志格式自定义 $var 变量
# $remote_addr 客户端ip $remote_user 远程客户端用户名,一般为:'-' $time_local 时间和地区
# $status 响应状态码 $body_bytes_sent 响应客户端内容字节数 $http_referer 记录用户从哪个链接跳转过来的
# $http_user_agent 用户使用的代理,一般都是浏览器 $http_x_forwarded_for 通过代理服务器来记录客户端的ip
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
# 访问日志
#access_log logs/access.log main;
# 打开文件传输
sendfile on;
# 数据包累计到一定的大小再发送,提高效率.需要启用 sendfile 才能使用.
#tcp_nopush on;
# 客户端连接服务器的超时时间 以秒为单位 http是无状态的协议 一般浏览器是60秒
# 保证客户端多次请求的时候不会重复建立连接,节省资源
#keepalive_timeout 0;
keepalive_timeout 65;
# 内容压缩 html css js
gzip on;
# 虚拟主机
server {
listen 80; # 监听端口
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
# 匹配规则
location = /50x.html {
root html;
}
}
server {
listen 8089; # 监听端口
server_name localhost;
location / {
root html;
index app.html index.htm;
}
}
}
nginx.pid打开失败以及失效的解决方案
nginx: [error] open() "/var/run/nginx/nginx.pid" failed (2: No such file or directory)
直接重新创建的话会报错
nginx: [error] invalid PID number "" in "/var/run/nginx/nginx pid"
需要重新指定配置文件之后再重载
./nginx -c /usr/local/nginx/conf/nginx.conf
./nginx -s reload
或者使用默认的pid,nginx默认的pid是在log文件夹之下的.
nginx指令
# 启动
./nginx
# 暴力停止
./nginx -s stop
# 优雅停止
./nginx -s quit
# 重新加载
./nginx -s reload
# 检查配置文件是否有问题
./nginx -t
# 指定配置文件
./nginx -c /usr/local/nginx/conf/nginx.conf
# 查看版本号
./nginx -v
./nginx -V
# 查看帮助
./nginx -h
Nginx进程模型
- master进程:主进程
- worker进程:工作进程
worker抢占机制
传统服务器事件处理(BIO)
同步阻塞通信模型
Nginx事件处理机制
异步非阻塞通信模型(多路复用器)
events {
use epoll; # 默认使用的
worker_connections 1024*2; # 每个worker允许最大连接数
}
同步与异步,阻塞与非阻塞
- 同步阻塞: 客户端发送请求给服务端,此时服务端处理任务时间很久,则客户端则被服务端堵塞了,所以客户端会一直等待服务端的响应,此时客户端不能做其它事,服务端也不会接受其他客户端的请求.这种通信机制比较简单粗暴,但是效率不高.
- 同步非阻塞: 客户端发送请求给服务端,此时服务端处理任务时间很久,这个时候虽然客户端会一直等待响应,但是服务端可以处理其他的请求,过一会回来的.这种方式很高效,一个服务端可以处理很多请求,不会在因为任务没有处理完而堵着,所以这是非阻塞的.
- 异步阻塞: 客户端发送请求给服务端,此时服务端处理任务时间很久,但是客户端不会等待服务器响应,它可以做其他的任务,等服务器处理完毕后再把结果返回给客户端,客户端得到回调后再处理服务端的响应.这种方式可以避免客户端一直处于等待的状态,优化了用户体验,其实就是类似于网页里发起的ajax异步请求.
- 异步非阻塞: 客户端发送请求给服务端,此时服务端处理任务时间很久,这个时候的任务虽然处理时间会很久,但是客户端可以做其他的任务,因为他是在异步回调函数里处理响应;同时服务端是非阻塞的,所以服务端可以去处理其他的任务,如此,这个模式就显得非常的高效了.
以上四点,除了第三点,其余的分别为BIO/NIO/AIO
。
BIO: 我去上厕所,这个时候坑位都满了,我必须等待坑位释放了,我才能上吧?!此时我啥都不干,站在厕所里盯着,过了一会有人出来了,我就赶紧蹲上.
NIO: 我去上厕所,这个时候坑位都满了,没关系,哥不急,我出去抽根烟,过会回来看看有没有空位,如果有我就蹲,如果没有我出去接着抽烟或者玩会手机.
异步阻塞: 我去上厕所,这个时候坑位都满了,没事我等着,等有了新的空位,让他通知我就行,通知了我,我就蹲上去.
AIO: 我去上厕所,这个时候坑位都满了,没事,我一点也不急,我去厕所外面抽根烟再玩玩手机,等有新的坑位释放了,会有人通知我的,通知我了,我就蹲上了.
同步 就是我需要自己每隔一段时间,以轮训的方式去看看有没有空的坑位;
异步 则是有人拉完茅坑会通知你,通知你后你再回去蹲;
阻塞 就是在等待的过程中,你不去做其他任何事情,干等着;
非阻塞 就是你再等待的过程中可以去做其他的事,比如抽烟、喝酒、烫头、玩手机.
总结:异步 的优势显而易见,大大优化用户体验, 非阻塞 使得系统资源开销远远小于 阻塞 模式,因为系统不需要创建新的进程(或线程),大大地节省了系统多出来的系统资源可以给其他的中间件去服务了.
Nginx日志分割
手动
cat_my_log.sh
#!/bin/bash
LOG_PATH="/var/log/nginx/"
RECORD_TIME=$(date -d "yesterday" +%Y-%m-%d+%H:%M)
PID=/var/run/nginx/nginx.pid
mv ${LOG_PATH}/access.log ${LOG_PATH}/access.${RECORD_TIME}.log
mv ${LOG_PATH}/error.log ${LOG_PATH}/error.${RECORD_TIME}.Log
# 向Nginx主进程发送信号,用于重新打开日志文件
kill -USR1 `cat $PID`
给脚本添加执行权限
chmod +x cat_my_log.sh
定时
# 安装crontabs
pacman -S cronie
systemctl enable cronie
systemctl start cronie
# 编辑并添加定时任务
crontab -e
*/1 * * * * /usr/local/nginx/sbin/cat_my_log.sh
# 重启定时任务
systemctl restart cronie
# 重新载入配置
systemctl reload cronie
# 查看定时任务
crontab -l
cron表达式
# 每分钟执行一次
*/1 * * * *
# 每天 23:59 执行
59 23 * * *
# 每天凌晨1点执行
0 1 * * *
Nginx常用配置参数
root与alias
假如服务器路径为:/home/lgq/files/img/face.png
root路径完全匹配访问
location /lgq {
root /home
}
这时的请求url:port/lgq/lgq/files/img/face.png
alias 可以为你的路径做一个别名,对用户透明
location /hello {
root /home/lgq
}
这时的请求url:port/hello/files/img/face.png
gzip压缩
# 开启gzip压缩,提高传输速率,节约带宽
gzip on;
# 限制最小压缩,小于1个字节的文件不会压缩
gzip_min_length 1;
# 1 - 9 压缩比,值越大压缩比越大
gzip_comp_level 3;
# 压缩类型
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png application/json;
location匹配规则
空格 :默认匹配,普通匹配
location / {
root /home;
}
= :精准匹配
location = /img/face1.png {
root G:/CodeSpace/my-code-base/Architect/static;
}
~* :匹配正则表达式,不区分大小写
# 符合图片的显示
location ~* \.(GIF|png|bmp|jpg|jpeg) {
root G:/CodeSpace/my-code-base/Architect/static;
}
~ :匹配正则表达式,区分大小写
# GIF必须大写才能匹配到
location ~ \.(GIF|png|bmp|jpg|jpeg) {
root G:/CodeSpace/my-code-base/Architect/static;
}
^~ :以某个字符路径开头
location ^~ /audio {
root G:/CodeSpace/my-code-base/Architect/static;
}
Nginx中解决跨域问题
CORS:Cross-Origin Resources Sharing 跨域资源共享
Jsonp、StringBoot Cors、Nginx
# 允许跨域请求的域,*代表所有
add_header 'Access-Control-Allow-Origin' *;
# 允许带上cookie请求
add_header 'Access-Control-Allow-Credentials' 'true';
# 允许请求的方法,比如 GET/POST/PUT/DELETE
add_header 'Access-Control-Allow-Methods' *;
# 允许请求的header
add_header 'Access-Control-Allow-Headers' *;
Nginx静态资源防盗链
使用valid_referers
进行验证
- none: 允许没有
http_refer
的请求访问资源 the “Referer” field is missing in the request header; - blocked: the “Referer” field is present in the request header, but its value has been deleted by a firewall or proxy server; such values are strings that do not start with “http://” or “https://”;
# 对源站点验证
valid_referers *.xxx.com;
# 非法引入会进入下方判断
if ($invalid_referer) {
return 403;
}
防盗链测试
不带http_referer
curl -I http://xxx.com:90/img/xxx.ico
HTTP/1.1 403 Forbidden
Server: nginx/1.18.0
Date: Sat, 07 Nov 2020 07:01:55 GMT
Content-Type: text/html
Content-Length: 153
Connection: keep-alive
带非法http_referer
curl -e "http://www.baidu.com" -I http://xxx.com:90/img/xxx.ico
HTTP/1.1 403 Forbidden
Server: nginx/1.18.0
Date: Sat, 07 Nov 2020 07:03:32 GMT
Content-Type: text/html
Content-Length: 153
Connection: keep-alive
带合法http_referer
curl -e "http://www.xxx.com" -I http://xxx.com:90/img/xx.ico
HTTP/1.1 200 OK
Server: nginx/1.18.0
Date: Sat, 07 Nov 2020 07:04:50 GMT
Content-Type: image/x-icon
Content-Length: 4286
Last-Modified: Tue, 24 Dec 2019 06:48:29 GMT
Connection: keep-alive
ETag: "5e01b4bd-10be"
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: *
Access-Control-Allow-Headers: *
Accept-Ranges: bytes
Nginx模块化体系
Nginx集群负载均衡
水平扩容
OSI 网络模型
OSI – Open System Interconnect, 意思就是 开放网络互联.
层级 | 名称 | 说明 |
---|---|---|
第七层 | 应用层 | 与用户行为交互 |
第六层 | 表示层 | 定义数据格式以及数据加密 |
第五层 | 会话层 | 创建、管理以及销毁会话 |
第四层 | 传输层 | 创建、管理请求端到响应端(端到端)的连接 |
第三层 | 网络层 | 请求端的IP地址 |
第二层 | 数据链路层 | 提供介质访问与链路管理 |
第一层 | 物理层 | 传输介质,物理媒介 |
应用层:这是面向用户的,最靠近用户,为了让用户和计算机交互,在计算机里会有很多软件,比如eclipse,idea,qq,nginx等,这些软件,用户可以通过这些应用软件和计算机交互,交互的过程其实就是接口的调用,应用层为用户提供了交互的接口,以此为用户提供相应的协议.那么在这一层最常见的协议有:HTTP,HTTPS,FTP,SMTP,POP3等.Nginx在本层,为七层负载均衡.
举例:我要寄一封信给远在天边的老外LiLei,我会打开快递软件下单,这个时候我是 用户 ,快递软件就是 应用服务 ,是建立在计算机应用层供给用户交互的一种服务或称之为手段.
表示层:该层提供数据格式编码以及加密功能,确保 请求端 的数据能被 响应端 的应用层识别.
举例:我写中文给LiLei,他看不懂,这个时候我就会使用翻译软件把中文翻译成英文,随后信中涉及到一些比较隐私的信息我会加密一层,这时候翻译软件和加密器就充当了 表示层 的作用,他用于显示用户能够识别的内容.
会话层:会话可以理解为session,请求发送到接受响应的这个过程之间存在会话,会话层就充当了这一过程的管理者,从创建会话到管理到最后销毁会话.
举例:我每次写信给LiLei都会记录在一个小本本上,寄信时间日期,收信时间日期,这本小本本上存有每次通信记录,这个小本本就相当于会话的管理者.又或者说,我们平时在打电话,首先需要拨打电话,这是 建立会话 ,对方接听电话,此时正在通话( 维持并管理会话)结束后 会话销毁 ,那么这也是一次会话的生命周期.
传输层:该层建立端到端的连接,他提供了数据传输服务,在传输层通信会涉及到端口号,本层常见的协议为TCP、UDP,LVS就是在这层的,也就是四层负载均衡.
举例:我和LiLei通信过程中会借助快递公司,快递公司会分配快递员取件和寄件,那么这个快递员则充当 传输层 的作用.
网络层:网络通信的时候必须要有本机IP和对方的IP,请求端和响应端都会有自己的IP的,IP就相当于你家地址门牌号,在网络上云服务拥有的公网IP,普通计算机也有,只不过是动态IP,运营商每天会分配不同的IP给你的计算机.所以网络层也能称之为IP层,IP是互联网的地址,能提供IP分配的设备则为路由器或交换机.
举例:对于拥有固定IP的云服务来说,他们都是由腾讯云、阿里云等这样的供应商提供的,他们为云服务器提供固定ip;电信、移动、运营商为你的计算机动态分配ip,每天都不同;则这些供应商和运营商都是网络层.同理,快递员由物流公司分配和管理,那么物流公司就是网络层咯.
数据链路层:这一层会提供计算机MAC地址,通信的时候会携带,为了确保请求投递正确,所以他会验证检测MAC地址,以确保请求的准确性.
举例:快递员在投递派送的时候,他(或客服)会预先提前打电话给你,确认你家地址对不对、有没有人、货到付款有没有准备好钱等,这时候快递员(或客服)就充当了 数据链路层 的职责.
物理层:真实的机器之间的物理连接.
四层负载均衡
基于IP+端口的负载均衡. 原理通过转发请求到后台服务器, 他只负责转发, 并且会记录当前连接是那个服务器处理的, 后续的请求就会由同一台服务器处理, 其实就是长连接. 是传输层的, 主要基于tcp和udp.
- F5 硬负载均衡
- LVS 四层负载均衡
- Haproxy 四层负载均衡
- Nginx 四层负载均衡
七层负载均衡
基于URL+IP
的负载均衡. 基于应用层的, 是针对应用层协议的. 和四层不同, 四层是不可以处理请求的, 而七层是可以的. 例如可以压缩和缓存一些请求的资源。
举例子: 买电影票. 黄牛, 不会处理用户诉求; 售票处, 可以提供相应的服务。
- Nginx 七层负载均衡
- Haproxy 七层负载均衡
- Apache 七层负载均衡
DNS地域负载均衡
Nginx构建Tomcat集群
nginx默认的负载均衡策略是轮询.
第一台Tomcat(虚拟机): http://192.168.128.128:8080
第二台Tomcat(linux笔记本):http://192.168.123.197:8080
第三台Tomcat(windows台式): http://192.168.123.187:8080
Nginx服务器(linux台式): http://192.168.123.26/
配置文件
# 配置上游服务器
upstream tomcats {
# ip 哈希
# ip_hash;
# url 哈希
# hash $request_uri;
# 最小连接数
# least_conn;
server 192.168.123.128:8080 weight=1;
server 192.168.123.187:8080 dwon;
server 192.168.123.197:8080 weight=3;
# 保持的连接数,长连接
keepalive 32;
}
# 配置server虚拟主机
server {
listen 80;
server_name www.tomcats.com;
# 针对200和304状态码的缓存设置过期时间
proxy_cache_valid 200 304 8h;
location / {
# 集群配置
proxy_pass http://tomcats;
# 默认是1.0 不是长连接
proxy_http_version 1.1;
# 清除信息
proxy_set_header Connection "";
}
}
使用JMeter测试单节点与集群的并发异常
创建线程组
线程数:用户数
Ramp-up 请求间隔时间.
upstream 指令参数
- max_conns: 服务器的最大连接数.注意使用多个工作进程,会涉及到共享内存的问题,这样肯定会超过max_conns.可起到限流的作用.
- slow_start:缓慢启动,缓慢进入集群.权重会逐渐变大,不健康到健康的过程.适用于集群,单组是不适用的.商业版本特征!该参数不能使用在
hash
和random load balancing
中. - down:标识服务状态,该节点不可用状态.
- backup:备用,说明这一台备用机,集群中服务器如果都不能访问了,就会被启用!该参数不能使用在
hash
和random load balancing
中. - max_fails:表示失败几次,则标记server已宕机,剔出上游服务.
- fail_timeout:表示失败重试时间,默认是10s.e.g. max_fails=2 fail_timeout=15s,则代表15s内请求某一server失败2次后,则认为这台server已经宕机了,随后再过15s,这15s内不会有新的请求到达刚刚挂掉的节点上,而是会请求在运行的server,15秒后会再有新请求尝试挂掉的server,如果还是失败,重复上一过程,直到恢复.
keepalive 参数
提高吞吐量.
- keepalived : 设置长连接处理的数量
- proxy_http_version :设置长连接http版本为1.1
- proxy_set_header :清除connection header 信息
负载均衡之ip_hash
ip_hash可以保证用户的同一个会话可以保证在同一台服.(分表也用到这种技术)。
根据iP的前3段进行计算的。
注意:用户的ip可能是动态变化的,这种情况就会有问题.还有一点就是,如果某一台服务器出现问题宕机了,是不能直接注释掉配置文件来剔除服务的,需要使用down
参数进行处理。
一致性hash算法
一致性哈希算法 : 对 2^32^ 取模, 将哈希值空间映射成虚拟的圆环。
将数据 key
(例如: 服务器ip, 主机名)使用相同的函数 Hash
计算出哈希值. 这样就能确定值在 Hash
环上的位置。而节点分布在圆环上面,确认 hash 值应该落圆环的哪个部位上。落在圆环上之后,顺时针寻找距离最近的节点。
如果某一节点挂掉了,找不到节点,也会会继续顺时针找。
最小化有损服务,对于节点的增减, 都只需要重新定位环空间中的一小部分数据, 具有较好的容错性和扩展性。
如果其中的某一个服务器宕机了。
如果增加服务器。
Hash环的数据倾斜问题。
节点太少,在环上分布不均匀,造成数据倾斜。大部分数据被缓存到某个节点上。
解决方案:引入虚拟节点。
即对每一个服务器节点计算多个 Hash
。可以在服务器ip的后面添加编号来实现。
负载均衡之url_hash
hash $request_uri;
注意url的值不一样, 例如在链接后面加个, hash出来的结果会不一样的。
负载均衡之least_conn
least_conn;
Nginx控制缓存
浏览器端, 加速单个用户浏览体验, 缓存到本地; nginx端优化内网的传输, 提升访问上游服务的速度和所有访问nginx一端的用户的体验.
Expires: 过期时间. 当服务器发现请求的资源时间没有更改, 会返回304给客户端, 代表可以使用缓存.
expires [time];
expires @[time]; @22h30m 以天为节点进行计算
expires -[time];
expires epoch; 不去缓存
expires off; nginx关闭缓存, 但是浏览器端还是有默认的缓存机制的.
expires max; 最大过期时间.
Nginx缓存配置
# proxy_cache_path设置缓存保存的目录 目录会自动创建.
# keys_zone 设置共享内存以及占用的大小
# max_size 设置缓存大小
# inactive 超过此时间, 缓存自动清理
# use_temp_path 关闭临时目录
proxy_cache_path /usr/local/nginx/upstream_cache keys_zone=mycache:5m max_size=1g inactive=8h use_temp_path=off
server {
# ...
# 开启并且使用缓存
proxy_cache mycache;
# 针对200和304状态码的缓存设置过期时间
proxy_cache_valid 200 304 8h;
}
Nginx配置ssl证书提供https访问
ssl证书导出,可以使用阿里云,腾讯云或者cloudflare的免费证书。
# 进入目录编译配置安装, 配置的时候注意添加ssl模块
./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi \
--with-http_ssl_module
make
make install
把证书 *.key
和 *.pem
放在nginx下的conf
目录下面
配置nginx.conf文件
# 开启ssl
ssl on;
# 配置ssl证书
ssl_certificate 4740733_lgq51233.xyz.pem;
# 配置证书秘钥
ssl_certificate_key 4740733_lgq51233.xyz.key;
# ssl会话cache
ssl_session_cache shared:SSL:1m;
# ssl会话超时时间
ssl_session_timeout 5m;
# 使用该协议进行配置.
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
# 配置加密套件,写法遵循 openssl 标准
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_prefer_server_ciphers on;
# Https配置
server {
listen 443;
server_name localhost;
location / {
# 集群配置
proxy_pass http://tomcats;
index index.html index.htm;
}
}