【Nginx安装】
Linux下直接使用包管理安装
sudo apt-get install nginx
使用whereis命令查看安装位置
whereis nginx
#sbin下代表nginx可执行程序
#etc/nginx下有nginx.conf配置文件
#usr/share下有html文件夹,可配置nginx的静态资源/页面
通过包管理安装的nginx已注册为服务,可用systemctl命令进行操作。
修改nginx.conf快速重启可使用命令:nginx -s reload
【Nginx均衡负载】
(一)NGINX均衡负载介绍
[1]情景:
当一个应用访问量很大时,一个服务器无法应对如此大的访问量时,就需要多个服务器同时运行这同一个Web应用。Nginx的作用就是将用户的请求按照一定的规则转发给Web应用服务器,实现均衡负载。用户不再直接对Web服务器进行请求,而是对Nginx进行请求.
[2]特点:
用户请求提交给Nginx,而非直接到Web服务器
Nginx配置了多个运行相同应用的Web服务器,根据权值将请求转发给Web服务器
[3]图解:
其中的Session服务器是指HttpSession对象,该Session对象被单独独立出来作为服务器,实现Session共享。
Session共享的原因:同一个用户的所有请求被Nginx转发不一定是同一个Web服务器,若不进行Session共享,上次请求被转发的web服务器进行了Session域的存储操作,下次请求未转发到上次的web服务器,此时就造成了Session数据中的丢失
(二)NGINX均衡负载在Web应用的配置
HttpSession的共享需要借助Redis来实现,即Session的内容存储在Redis中,所有的RealServer(Web服务器)都需接入该Redis获得Session信息。
实现步骤:
【1】构建SpringBoot项目,并追加以下依赖
Redis相关依赖
org.springframework.boot
spring-boot-starter-data-redis
io.lettuce
lettuce-core
redis.clients
jedis
SessionData相关依赖
org.springframework.session
spring-session-data-redis
【2】配置Redis
在全局配置文件application.properties中添加redis相关配置
#其余默认配置,此处为redis相关配置
spring.redis.database=0
spring.redis.host=127.0.0.1
spring.redis.port=6379
#spring.redis.password= #redis默认密码为空
spring.redis.jedis.pool.max-active=8
spring.redis.jedis.pool.max-idle=8
spring.redis.jedis.pool.max-wait=-1ms
sprinq.redis.jedis.pool.min-idle=0
Tips:真实部署环境时,redis的ip都要定位到同一个主机,此处由于redis也在本机,所以为127.0.0.1
【3】配置tomcat的端口号
由于要模拟两个web服务器,电脑只有一台,因此需要设置不同端口来模拟,该web应用打两个jar包,这两个端口号不同,作为两个web服务器。本次演示用8081与8082
#tomcat配置,配置两个端口,代表不同的服务器
server.port=8082
(三)NGINX均衡负载配置(windows)
此处下载的是windows版本的NGINX
解压后进入安装目录找到nginx.conf文件
找到server节点:
server节点表示访问NGINX的配置,其包含以下配置:
指定NGINX的端口号【默认80】,和服务器名字(域名)【默认localhost】
指定转发上游location proxy_pass。即负载均衡到哪些web服务器上,及其权值【需要在server节点上面同级创建upstream节点来指定web服务器】
注意location后面的/,此处可以配外部访问Nginx服务的前缀(一般不以/结束)
具体格式如下:
upstream prprzuikaku.com{
server 127.0.0.1:8081 weight=1;
server 127.0.0.1:8082 weight=1;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://prprzuikaku.com;
}
需要注意:
上游名字upStream与下面的proxy_pass要对应,具体值无所谓(是否为域名形式也无所谓)
若上游节点没有配置权值,默认策略为轮询,即一次A一次B一次A一次B
(四)测试
Tips:由于Nginx的请求转发具有一定的不确定性,所以可能要多次测试,直到看到两种端口得到的消息,则说明配置成功的。
[1]测试类:
该Controller共两个方法,一个用于向Session中存数据,一个用于从Session中取数据,其中有一个port的字段,从application.properties文件中注入,这个字段在取数据时也会打印出来。目的就是为了区别是哪个web服务器发送的。
@Controller
@RequestMapping("/test")
public class MyController {
@Value("${server.port}")
private String port;
@GetMapping("/index")
public String index(Model model){
return "index";
}
@RequestMapping("/save")
@ResponseBody
public String saveToSession(@RequestParam("input")String input, HttpSession httpSession){
httpSession.setAttribute("input",input);
return "输入的值已存入HttpSession
";
}
@RequestMapping("/get")
@ResponseBody
public String getFromSession(@SessionAttribute("input")String input){
return ""+"来自端口:"+port+"取值为:"+input+"
";
}
}
[2]index.html:
该页面就是主页,其中有一个表单用来提交存的值,另一个超链接则是用来获取存的值
首页
传入一个值存入session
获得session中的值
[3]验证方法
我们通过访问Nginx进入主页,此时不知道自己是被分发到哪个web服务器,但这不用管。直接访问"获取Session中的值"这个超链接,在取值时会得到服务器的端口号,直到看到两个端口号都显示过一次后,说明Nginx是配置成功的,HttpSession共享正常。
同时运行两个服务:作为两个服务器
请求转发到8082了
请求转发到8081了
【Nginx反向代理】
(一)NGINX反向代理介绍
【1】情景
一台服务器可能运行多个Web服务,这些Web服务可以通过不同的端口给到外界访问,但可能由于安全的原因,服务器只向外提供了一个用于Web访问的端口。多个web服务只能通过该端口进行访问,为了区别不同的项目,则需要配置不同的前缀映射到对应的端口,而这个操作就是Nginx的反向代理,这个向外界提供的端口就是Nginx服务的端口。【这些Web具体服务也可以来自不同的主机,Nginx相当于对这些分布各地的服务器做了一个统一的入口访问】
【2】特点
用户发起请求先到Nginx再去代理,而非直接到Web服务
通过Ip:Nginx端口/前缀/ 的方式访问到原服务器多个不同端口的web服务
Nginx可以直接挂载一个目录实现全静态网页的访问
【3】图解
(二)NGINX反向代理在Web应用的配置
在/nginx/conf/nginx.conf中进行配置
【初始配置文件(生效部分)】
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
【参数讲解】
server下的listen,此处配置是Nginx的访问端口
server下的server_name代表受信任的域,一般配置有哪些域名或ip可以访问到该nginx以空格隔开
默认的映射配置包含location /,error_page,location=/50x此处定向访问Nginx不加前缀时的首页,要让错误页面配置生效,则需要在nginx的html文件夹下创建50x.html,当然error_page可以追加设置其他http错误code
注意!:location的url应该以/作为结束,对于映射的服务地址,也应该以/作为结束(避免映射静态目录时由于无/而认为是文件)
【配置反向代理-案例】
指定对应的url前缀和服务地址(ip(domain):port),在server标签下新增location标签
#pilipili
location / {
proxy_pass https://localhost:8081/;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
client_max_body_size 512m;
}
#docker监测
location /docker/ {
proxy_pass http://localhost:9000/;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
}
#下载中心
location /download/ {
alias /home/nanoda/download/;
autoindex on;
autoindex_exact_size off;
charset utf-8;
}
#定义通用的错误页面(error.html在/usr/share/nginx/html中)
error_page 500 502 503 504 404 /error.html;
location = /error.html {
root html;
charset utf-8;
}
client_max_body_size是指上传文件的大小限制【可配置到location标签中,或放入http标签中】
需要注意:
【1】如果Nginx服务所使用的端口存在端口映射,请保证外网端口与内网端口相同,否则在外网访问时Nginx时,页面的重定向会走内网的端口,而忽略外网导致无法访问。此时需要指定nginx的服务端口就与外部端口相同。同端口号映射即可。(或增加Nginx配置处理也行)
方案1:nginx端口与外网端口相同,端口映射时同端口号
方案2:nginx对于该应用的location标签添加以下配置:
#web1
location /web1/ {
if (-d $request_filename) {
rewrite [^/]$ $scheme://$http_host$uri/ permanent;
}
【2】如果转发的服务中需要使用WebSocket,则在location下需增加两个配置:
proxy_set_header Connection "Upgrade";
proxy_set_header Upgrade $http_upgrade;
【Nginx配置Https】
【1】下载Nginx专用的证书文件
将其放置nginx目录中/conf/cert文件夹中。【cert文件夹需要手动创建】
【2】修改配置文件
在server标签中追加ssl的相关配置,并修改端口,绑定域名
server {
listen 2333 ssl;
server_name www.pilipili.live;
ssl_certificate /home/nanoda/ssl/www.pilipili.live.pem;
ssl_certificate_key /home/nanoda/ssl/www.pilipili.live.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #加密协议配置
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; #加密套件配置
ssl_prefer_server_ciphers on;#打开
...其他配置
}
反向代理配置的location /需要使用https端口服务
location /web3/ {
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 https://localhost:4433/;
client_max_body_size 300m;
}
配置http强制跳转至https
增加一个server标签用于配置http的访问,并在里面进行重定向
server {
listen 80;
server_name www.zuikakuedu.top;
rewrite ^(.*)$ https://$host$1 permanent;
}
Tips:外界访问nginx证书使用nginx配置的ssl,与web服务器本身配置的ssl无关,除非直接访问本身web服务。
【Nginx调优配置】
调优后的nginx.conf
#工作进程数(与逻辑处理器相同)
worker_processes 1;
#进程处理器绑定(避免分配不均)
#worker_cpu_affinity 0001 0010 0100 1000;
#nginx_worker进程最大打开文件数
worker_rlimit_nofile 20480;
events {
accept_mutex on;
multi_accept on;
#单个进程允许的最大连接数
worker_connections 20480;
}
http {
#关闭访问日志记录
access_log off;
#开启高效文件传输模式
sendfile on;
sendfile_max_chunk 5m;
#数据尽快发送,提高效率
tcp_nodelay on;
include mime.types;
default_type application/octet-stream;
#优化服务器域名的散列大小
server_names_hash_max_size 512;
server_names_hash_bucket_size 128;
#请求体最大大小(大文件上传时需关注)
client_max_body_size 512m;
client_header_buffer_size 4k;
large_client_header_buffers 8 8k;
client_body_buffer_size 256k;
#会话生效时间
keepalive_timeout 30;
#开启gzip压缩功能,对静态资源进行压缩
gzip on;
gzip_vary on;
#压缩最小阈值设置(小于该大小则不压缩)
gzip_min_length 5k;
gzip_buffers 8 128k;
gzip_proxied any;
gzip_http_version 1.1;
#压缩等级(1-10)
gzip_comp_level 4;
gzip_disable msie6;
#需要压缩的文件类型
gzip_types text/plain text/css text/xml text/javascript application/javascript application/json application/xml+rss application/rss+xml application/atom+xml image/svg+xml;
#静态资源缓存
open_file_cache max=20480 inactive=20s;
open_file_cache_min_uses 1;
open_file_cache_valid 30s;
open_file_cache_errors on;
reset_timedout_connection on;
client_body_timeout 20;
send_timeout 2;
proxy_buffer_size 128k;
proxy_buffers 32 128k;
proxy_busy_buffers_size 128k;
#Http强制重定向到Https
server {
listen 80;
server_name www.zuikakuedu.top;
rewrite ^(.*)$ https://$host$1 permanent;
}
server {
listen 443 ssl;
server_name www.zuikakuedu.top;
ssl_certificate /home/admin/ssl/5087465_www.zuikakuedu.top.pem;
ssl_certificate_key /home/admin/ssl/5087465_www.zuikakuedu.top.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #加密协议配置
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; #加密套件配置
ssl_prefer_server_ciphers on;
#最咔酷线上课堂
location / {
proxy_pass https://localhost:9091/;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header Connection "Upgrade";
proxy_set_header Upgrade $http_upgrade;
}
#宝塔
location /btSystem/ {
proxy_pass http://localhost:8888/btSystem/;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
}
#docker
location /docker/ {
proxy_pass http://localhost:9000/;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
}
#下载中心
location /download/ {
alias /home/admin/download/;
autoindex on;
autoindex_exact_size off;
charset utf-8;
}
#通用错误页面配置(/usr/share/nginx/html/error.html)
error_page 500 502 503 504 404 /error.html;
location = /error.html {
root html;
charset utf-8;
}
}
}