课程资料 链接:https://pan.baidu.com/s/1SDaW0y5Qcjx6AFt316Y-SQ 提取码:4dw5
Nginx安装
yum install -y gcc gcc-c++
解压后 进入目录
./configure
make &&make install
ln -s /usr/local/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.1
ln -s /usr/local/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1
tar -zxvf nginx-1.21.6.tar.gz
cd nginx-1.21.6
./configure
make && make install
cd /usr/local/nginx
systemctl stop firewalld
./nginx -s stop
./nginx -s quit
./nginx -s reload
./nginx -t
ps -ef|grep nginx

在这之前最好停止nginx 通过系统服务的方式启动nginx
vim /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
ExecQuit=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target
Nginx 目录
conf #配置文件
|-nginx.conf # 主配置文件
|-其他配置文件,都被引入到了nginx.conf
html #静态页面
logs
|-access.log #访问日志(每次访问都会记录)
|-error.log #错误日志
|-nginx.pid #进程号
sbin
|-nginx #主进程文件
*_temp #运行时,生成临时文件

Nginx配置
指令
listen

listen 127.0.0.1:8000;
listen 127.0.0.1;
listen 8000;
listen *:8000;
default_server 属性是标识符,用来将此虚拟主机设置成默认主机。所谓的默认主机指的是如果没有 匹配到对应的address:port ,则会默认执行 的。如果不指定默认使用的是第一个server 。
server{
listen 8080 default_server;
server_name localhost;
default_type text/plain;
return 444 'This is a error request';
}
server_name
~ : 用于表示当前uri中包含了正则表达式 ,并且区分 大小写 ~* : 用于表示当前uri中包含了正则表达式,并且不区分 大小写 ^~ : 用于不包含正则表达式的uri前缀 ,功能和不加符号的一致,唯一不同的是,如果模式匹配,那么就停止搜索其他模式了
关于server_name的配置方式有三种,分别是: 精确匹配 通配符匹配 正则表达式匹配
server {
listen 80;
}
匹配顺序分别为
location
location:用来设置请求的URI
不带符号 ,要求必须以指定模式开始
server {
listen 80;
server_name 127.0.0.1;
location /abc{
default_type text/plain;
return 200 "access success";
}
}
= : 用于不包含正则表达式的uri前 ,必须与指定的模式精确匹配
server {
listen 80;
server_name 127.0.0.1;
location =/abc{
default_type text/plain;
return 200 "access success";
}
}
error_page
(1)可以指定具体跳转的地址
server {
error_page 404 http://www.dhy.cn;
}
(2)可以指定重定向地址
server{
error_page 404 /50x.html;
error_page 500 502 503 504 /50x.html;
location =/50x.html{
root html;
}
}
简化版的nginx.conf
worker_processes 1;
events{
accept_mutex on;
multi_accept on;
worker_connections 1024;
use epoll;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
tcp_nopush on;
tcp_nodelay 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;
}
}
}
 
sendfile 打开sendfile,用户请求的数据不用再加载到nginx的内存中,而是直接发送 
Nginx配置使用场景
修改nginx配置文件后,记得重新加载nginx ==> ./nginx -s reload
不同二级域名,映射到不同静态网页
可以写多个server字段,从前向后匹配,先匹配到哪个就用哪个
用户访问pro.hedaodao.ltd ,就会走到第一个server配置;test.hedaodao.ltd 走到第二个配置
http {
server {
listen 80;
server_name pro.hedaodao.ltd;
location / {
root html/pro;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 80;
server_name test.hedaodao.ltd;
location / {
root html/test;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
不同域名,映射到同一静态页面 server_name
- 可以写多个,用空格分开
- 使用通配符(*)
- 使用正则表达式(https://blog.csdn.net/yangyelin/article/details/112976539)
http{
server {
listen 80;
server_name *.hedaodao.ltd ~^[0-9]+\.hedaodao\.ltd$;
location / {
root html/test;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
Nginx命令配置到系统环境
(1)修改/etc/profile 文件
vim /etc/profile
export PATH=$PATH:/usr/local/nginx/sbin
source /etc/profile
nginx -v
正则表达式

反向代理与负载均衡
反向代理:这种代理方式叫做,隧道代理。有性能瓶颈,因为所有的数据都经过Nginx,所以Nginx服务器的性能至关重要  负载均衡:把请求,按照一定算法规则,分配给多台业务服务器(即使其中一个坏了/维护升级,还有其他服务器可以继续提供服务) 
反向代理
启用proxy_pass,root和index字段就会失效
proxy_pass后的地址必须写完整 http://xxx ,不支持https
当访问localhost时(Nginx服务器),网页打开的是http://xxx (应用服务器),网页地址栏写的还是localhost
http{
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://xxx;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
编写proxy_pass的时候,后面的值要不要加"/" ?
server {
listen 80;
server_name localhost;
location /{
proxy_pass http://192.168.200.146/;
}
}
当客户端访问 http://localhost/index.html,效果是一样的
server{
listen 80;
server_name localhost;
location /server{
proxy_pass http://192.168.200.146/;
}
}
当客户端访问 http://localhost/server/index.html
这个时候,第一个proxy_pass就变成了http://localhost/server/index.html
第二个proxy_pass就变成了http://localhost/index.html效果就不一样了。
结论: 不加了/,拼接location的uri, 加了/,不拼接
负载均衡
使用upstream 定义一组地址【在server字段下】 服务端设置
这里不准备三台虚拟机,充当真实服务器,而使用端口进行区分
server {
listen 9001;
server_name localhost;
default_type text/html;
location /{
return 200 '<h1>192.168.111.101:9001</h1>';
}
}
server {
listen 9002;
server_name localhost;
default_type text/html;
location /{
return 200 '<h1>192.168.111.101:9002</h1>';
}
}
server {
listen 9003;
server_name localhost;
default_type text/html;
location /{
return 200 '<h1>192.168.111.101:9003</h1>';
}
}
负载均衡器设置
upstream backend{
server 192.168.111.101:9091;
server 192.168.111.101:9092;
server 192.168.111.101:9093;
}
server {
listen 80;
server_name localhost;
location /{
proxy_pass http://backend;
}
}
负载均衡状态
代理服务器在负责均衡调度中的状态有以下几个: 
down down:将该服务器标记为永久不可用,那么该代理服务器将不参与负载均衡
upstream backend{
server 192.168.111.101:9001 down;
server 192.168.111.101:9002;
server 192.168.111.101:9003;
}
server {
listen 80;
server_name localhost;
location /{
proxy_pass http://backend;
}
}
该状态一般会对需要停机维护的服务器进行设置。
backup backup:将该服务器标记为备份服务器,当主服务器不可用时,将用来传递请求。
当主服务器恢复时,会使用主服务器来处理请求
upstream backend{
server 192.168.111.101:9001 ;
server 192.168.111.101:9002 backup;
server 192.168.111.101:9003;
}
server {
listen 80;
server_name localhost;
location /{
proxy_pass http://backend;
}
}
介绍一个工具firewall-cmd ,该工具是Linux提供的专门用来操作firewall的。
firewall-cmd --query-port=9001/tcp
firewall-cmd --permanent --add-port=9002/tcp
firewall-cmd --permanent --add-port=9001-9003/tcp
firewall-cmd --permanent --remove-port=9003/tcp
firewall-cmd --reload
其中:
upstream backend{
server 192.168.111.101:9001 ;
server 192.168.111.101:9002 ;
server 192.168.111.101:9003 max_conns=100 ;
}
server {
listen 80;
server_name localhost;
location /{
proxy_pass http://backend;
}
}
max_fails和fail_timeout max_fails=number :设置允许请求代理服务器失败的次数,默认为1。
fail_timeout=time :设置经过max_fails失败后,服务暂停的时间,默认是10秒
upstream backend{
server 192.168.111.101:9001 ;
server 192.168.111.101:9002 ;
server 192.168.111.101:9003 max_fails=3 fail_timeout=15;
}
server {
listen 80;
server_name localhost;
location /{
proxy_pass http://backend;
}
}
负载均衡策略
weight加权[加权轮询] 访问使用哪个地址的权重
upstream backend{
server 192.168.111.101:9001 weight=10;
server 192.168.111.101:9002 weight=5;
server 192.168.111.101:9003 weight=3;
}
server {
listen 80;
server_name localhost;
location /{
proxy_pass http://backend;
}
}
ip hash
可以解决session共享问题
upstream backend{
ip_hash;
server 192.168.111.101:9001 ;
server 192.168.111.101:9002 ;
server 192.168.111.101:9003 ;
}
server {
listen 80;
server_name localhost;
location /{
proxy_pass http://backend;
}
}
url_hash
upstream backend{
hash &request_uri;
server 192.168.111.101:9001 ;
server 192.168.111.101:9002 ;
server 192.168.111.101:9003 ;
}
server {
listen 80;
server_name localhost;
location /{
proxy_pass http://backend;
}
}
least_conn
最少连接,把请求转发给连接数较少的后端服务器。轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn 这种方式就可以达到更好的负载均衡效果
upstream backend{
least_conn;
server 192.168.111.101:9001 ;
server 192.168.111.101:9002 ;
server 192.168.111.101:9003 ;
}
server {
listen 80;
server_name localhost;
location /{
proxy_pass http://backend;
}
}
动静分离
当用户请求时,动态 请求分配到Tomcat 业务服务器,静态 资源请求放在Nginx 服务器中
例子:
图片目录

Nginx配置

index.html引入两个图片

访问

URL重写
rewrite是URL重写的关键指令,根据regex(正则表达式)部分内容,重定向到replacement,结尼是flag标记。
rewrite <regex> <replacement> [flag];
关键字 正则 替代内容 flagt标记
正则:per1森容正则表达式语句进行规则匹配
替代内容:将正则匹配的内容替换成replacement
flag标记说明:
last
break
redirect
permanent
浏览器地址栏访问 http://localhost/123.html 实际上是访问http://localhost//index.jsp?pageNum=123
server {
listen 80;
server_name localhost;
location / {
rewrite ^/([0-9]+).html$ /index.jsp?pageNum=$1 break;
proxy_pass http://xxx;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
网关服务器

上图中,应用服务器,不能直接被外网访问到,只能通过Nginx服务器进行访问(使用proxy_pass ),这时候这台Nginx服务器就成为了网关服务器(承担入口的功能)
所以,我们启动应用服务器的防火墙 ,设置其只能接受这台Nginx服务器的请求 启动防火墙
systemctl start firewalld.service
不让外网直接访问的加上rich规则 
例:在192.168.111.102 上加
添加rich规则
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.111.101" port protocol="tcp" port="8080" accept"
移除rich规则
firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.168.111.101" port port="8080" protocol="tcp" accept"
重启
移除和添加规则都要重启才能生效
firewall-cmd --reload
查看所有规则
firewall-cmd --list-all

配置Nginx
在192.168.111.101
查看指定端口的进程号
netstat -tanlp |grep 端口号
nginx配置,访问该主机的80端口,可以跳到192.168.111.102:8080 
访问

防盗链
当我们请求到一个页面后,这个页面一般会再去请求其中的静态资源,这时候请求头中,会有一个referer字段 ,表示当前这个请求的来源,我们可以限制指定来源的请求才返回,否则就不返回,这样可以节省资源

valid_referers none|server_name
设置有效的referer值
- none:检测地址
没有referer,则有效 - server_name:检测主机地址,
referer显示是从这个地址来的,则有效 (server_name必须是完整的http://xxxx ) 注意:if ($invalid_referer) 中if后有个空格 ,不写就会报错
nginx: [emerg] unknown directive "if($invalid_referer)" in /usr/local/nginx/conf/nginx.conf:27
Nginx配置
例子:这里设置nginx服务器中的img 目录下的图片必须referer 为http:192.168.174/133才能访问
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://xxx;
}
location /img{
valid_referers http:192.168.174/133;
if ($invalid_referer){
return 403;
}
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
如果引用这张图片的页面且referer 并没有被设置,图片无法加载出来 如果直接访问图片地址,因为没有refer 字段指向来源,会直接显示Nginx 的页面 
设置盗链图片
将提示图片放在html/img/x.png,访问设置防盗链图片时,就返回这x.png张图
location /img{
valid_referers http:192.168.174/133;
if ($invalid_referer){#无效的
rewrite ^/ /img/x.png break;
}
root html;
index index.html index.htm;
}
跨域问题解决
同源策略
浏览器的同源策略:是一种约定,是浏览器最核心也是最基本的安全功能,如果浏览器少了同源策略,则浏览器的正常功能可能都会受到影响 同源: 协议、域名(IP)、端口相同即为同源
http://192.168.200.131/user/1
https://192.168.200.131/user/1
不
http://192.168.200.131/user/1
http://192.168.200.132/user/1
不
http://192.168.200.131/user/1
http://192.168.200.131:8080/user/1
不
http://www.nginx.com/user/1
http://www.nginx.org/user/1
不
http://192.168.200.131/user/1
http://192.168.200.131:8080/user/1
不
http://www.nginx.org:80/user/1
http://www.nginx.org/user/1
满足
跨域问题
简单描述下:
有两台服务器分别为A,B,如果从服务器A的页面发送异步请求到服务器B获取数据, 如果服务器A和服务器B不满足同源策略,则就会出现跨域问题。 案例演示
 1)nginx的html目录下新建一个a.html
<html>
<head>
<meta charset="utf-8">
<title>跨域问题演示</title>
<script src="jquery.js"></script>
<script>
$(function(){
$("#btn").click(function(){
$.get('http://192.168.200.133:8080/getUser',function(data){
alert(JSON.stringify(data));
});
});
});
</script>
</head>
<body>
<input type="button" value="获取数据" id="btn"/>
</body>
</html>
2)在nginx.conf配置如下内容
server{
listen 8080;
server_name localhost;
location /getUser{
default_type application/json;
return 200 '{"id":1,"name":"TOM","age":18}';
}
}
server{
listen 80;
server_name localhost;
location /{
root html;
index index.html;
}
}
3)通过浏览器访问测试 
解决方案
使用add_header指令,该指令可以用来添加一些头信息 Access-Control-Allow-Origin : 直译过来是允许跨域访问的源地址信息 ,可以配置多个(多个用逗号分隔),也可以使用*代表所有源 Access-Control-Allow-Methods :直译过来是允许跨域访问的请求方式,值可以为 GET POST PUT DELETE…,可以全部设置,也可以根据需要设置,多个用逗号分隔
具体配置方式
location /getUser{
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE;
default_type application/json;
return 200 '{"id":1,"name":"TOM","age":18}';
}
高可用场景

用户访问时,访问的是一个虚拟IP ,keepalived会选定一个主服务器使用这个虚拟IP 每台机器上的keepalived会相互通信 ,根据其他机器上的keepalived进程是否存在,判断服务器状态,如果默认的Master停止 了,就会在剩下的Backup机器中,竞选出一台Nginx服务器作为Master
安装keepalived
yum install -y keepalived
修改keepalived配置
- 配置文件在
/etc/keepalived/keepalived.conf vrrp_instance 、authentication 、virtual_router_id 、virtual_ipaddress 这几个一样的机器,才算是同一个组里。这个组才会选出一个作为Master 机器 这里我们设置两台机器,分别下载好keepalived ,然后进行配置
vim /etc/keepalived/keepalived.conf
机器一:
! Configuration File for keepalived
global_defs {
router_id lb
}
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh"
interval 2
weight 2
}
vrrp_instance dingchao {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.111.110
}
}
机器二:
! Configuration File for keepalived
global_defs {
router_id lb2
}
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh"
interval 2
weight 2
}
vrrp_instance dingchao {
state BACKUP
interface ens33
virtual_router_id 51
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.111.110
}
}
添加检测脚本
vim /usr/local/src/nginx_check.sh
chmod +x /usr/local/src/nginx_check.sh
#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
启动
cd /usr/local/sbin
./keepalived
Gzip压缩
作用域 http, server, location
gzip on;
开关,默认关闭
gzip_buffers 32 4k|16 8k
缓冲区大小
gzip_comp_level 1;
压缩等级 1-9,数字越大压缩比越高
gzip_http_version 1.1;
使用gzip的最小版本
gzip_min_length
设置将被gzip压缩的响应的最小长度。 长度仅由“Content-Length”响应报头字段确定。
gzip_proxied 多选
off 为不做限制 作为反向代理时,针对上游服务器返回的头信息进行压缩
expired - 启用压缩,如果header头中包含 “Expires” 头信息 no-cache - 启用压缩,如果header头中包含 “Cache-Control:no-cache” 头信息 no-store - 启用压缩,如果header头中包含 “Cache-Control:no-store” 头信息 private - 启用压缩,如果header头中包含 “Cache-Control:private” 头信息 no_last_modified - 启用压缩,如果header头中不包含 “Last-Modified” 头信息 no_etag - 启用压缩 ,如果header头中不包含 “ETag” 头信息 auth - 启用压缩 , 如果header头中包含 “Authorization” 头信息 any - 无条件启用压缩
gzip_vary on;
增加一个header,适配老的浏览器 Vary: Accept-Encoding
gzip_types
哪些mime类型的文件进行压缩
gzip_disable
禁止某些浏览器使用gzip
完整实例
gzip on;
gzip_buffers 16 8k;
gzip_comp_level 6;
gzip_http_version 1.1;
gzip_min_length 256;
gzip_proxied any;
gzip_vary on;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_types
text/xml application/xml application/atom+xml application/rss+xml application/xhtml+xml image/svg+xml
text/javascript application/javascript application/x-javascript
text/x-json application/json application/x-web-app-manifest+json
text/css text/plain text/x-component
font/opentype application/x-font-ttf application/vnd.ms-fontobject
image/x-icon;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";
HTTP/1.1 200
Server: nginx/1.21.6
Date: Wed, 18 May 2022 17:42:35 GMT
Content-Type: text/html;charset=utf-8
Content-Length: 7832
Connection: keep-alive
Keep-Alive: timeout=65
|