43、nginx的优化、防盗链、重定向、代理

news2024/11/23 11:22:45

nginx的优化、防盗链、重定向、代理

一、nginx的优化

1.1、隐藏版本号

server_tokens off;隐藏版本号

[root@test1 conf]# vim nginx.conf

server_tokens off;

[root@test1 conf]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@test1 conf]# systemctl restart nginx
[root@test1 conf]# curl -I 192.168.168.10:8881/test1/
HTTP/1.1 200 OK
Server: nginx
Date: Tue, 02 Jul 2024 08:31:42 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 12
Last-Modified: Tue, 02 Jul 2024 08:02:36 GMT
Connection: keep-alive
ETag: "6683b41c-c"
Accept-Ranges: bytes
  • 修改用户和组
  • user nobody;##表示主进程master会由root创建,子进程会由nginx用户来创建。用户 所在组

在这里插入图片描述

1.2、日志分割:

apache是自带日志分割的,按天进行收集日志

access.log

error-2024-07-03

[root@test1 opt]# date -d "-1 day" "+%Y%m%d"
20240702
[root@test1 opt]# date -d "0 day" "+%Y%m%d"
20240703
[root@test1 opt]# date -d "+1 day" "+%Y%m%d"
20240704

在这里插入图片描述

在这里插入图片描述

day=$(date -d "-1 day" "+%Y%m%d")
#先指定好日志,显示前一天的时间
logs_path="/usr/local/nginx/logs/"
#指定pid文件的位置
pid_path="/usr/local/nginx/run/nginx.pid"
mv /usr/local/nginx/logs/access.log ${logs_path}access-${day}.log
mv /usr/local/nginx/logs/error.log ${logs_path}error-${day}.log
kill -USR1 $(cat ${pid_path})
#重新创建一个新的日志,日志分割
#加上日志清理
find ${logs_path} -mtime +30 -exec rm -rf {} \;
#清理30内日志
day=$(date -d "-1 day" "+%Y%m%d")
#先指定好日志,显示前一天的时间
logs_path="/usr/local/nginx/logs/"
#指定pid文件的位置
pid_path="/usr/local/nginx/run/nginx.pid"
mv /usr/local/nginx/logs/access.log /usr/local/nginx/logs/access-20240707.log
mv /usr/local/nginx/logs/error.log ${logs_path}error-${day}.log
kill -USR1 $(cat ${pid_path})
#重新创建一个新的日志,日志分割
#加上日志清理
find ${logs_path} -mtime +30 -exec rm -rf {} \;
#清理30内日志
这条命令的作用是向一个特定的进程发送`USR1`信号。这个进程是通过读取一个文件(该文件的路径存储在变量`${pid_path}`中)中的进程ID(PID)来确定的。下面我将分步解释这条命令的各个部分:

1. **`$(cat ${pid_path})`**:这部分是一个命令替换(Command Substitution)的操作。`cat ${pid_path}`命令的作用是读取存储在变量`${pid_path}`中的文件路径所指向的文件内容。通常,这个文件内容包含了一个或多个进程ID(PID)。如果文件只包含一个PID,那么这个命令就会输出这个PID;如果包含多个PID,则输出会包含这些PID,但在这个特定的命令上下文中,通常假设文件只包含一个PID。
2. **`kill -USR1`**:`kill`命令用于向进程发送信号。`-USR1`参数指定了要发送的信号是`USR1`(用户自定义信号1)。在Unix和类Unix系统中,`USR1`和`USR2`是两种用户定义的信号,它们可以被进程用来实现特定的功能,如重新加载配置文件、打印调试信息等,具体取决于进程对这些信号的处理方式。
3. **将两者结合**:`kill -USR1 $(cat ${pid_path})`这条命令的作用就是读取`${pid_path}`文件中的内容(即进程ID),然后向这个进程ID对应的进程发送`USR1`信号。

举个例子,如果`${pid_path}`是`/var/run/myapp.pid`,而这个文件的内容是`1234`,那么这条命令就相当于`kill -USR1 1234`,它会向PID为1234的进程发送`USR1`信号。

需要注意的是,如果`${pid_path}`文件不存在或为空,或者指定的PID不存在,那么`kill`命令可能会失败并显示错误信息。此外,如果`${pid_path}`文件中包含多个PID,并且你的意图是向所有这些PID发送信号,那么这条命令可能不会按预期工作,因为它只会尝试向第一个PID发送信号(尽管某些shell可能会处理这种情况,但这不是标准行为)。在这种情况下,你可能需要编写一个脚本来逐个处理文件中的PID。


1.3、更改进程数,以及设置cpu绑定

worker_processes  4;

#表示进程由4个,这里和cpu数挂钩,不绑定cpu的话,进程会在两个cpu之间来回切换。浪费资源



worker_cpu_affinity 0001 0010 0100 1000(1234);

#绑定cpu,避免切换

1.4、设置连接超时时间

 keepalive_timeout  65;

#请求完成之后的连接保持时间。65秒。60-120秒。

client_header_timeout 80;

#客户端发送一个完整的请求头的超时时间,80s之内没有发送一个完整的请求头,nginx会返回码408(request time out)

client_body_timeout 80;

#客户端和服务端建立连接之后,发送请求体的超时时间,客户端在80秒内没有发送任何内容,nginx返回码408。

1.5、页面压缩

gzip on;

#配置页面压缩

gzip_min_length 1k;

#最小的压缩文件,小于等于1k的文件不压缩。



gzip_buffers 4 64k;
#设置压缩的缓冲区,4个,每个缓冲区的大小64K



gzip_como_level 6;

#压缩比例 1-9,数字越小,压缩的比率越小,
速度越快,数字越大,压缩的比率就越高,速度越慢;



gzip_types text/plain text/javascript application/x-javascript text/css text/xml application/xml application/xml+rss image/jpg image/jpeg image/png image/gif application/x-httpd-php application/javascript application/json;
#支持压缩的类型;

1.6、设置页面的缓存时间,主要针对动态页面,图片的缓存。

vim nginx.conf

location ~ \.(gif|jpg|png)$ {
        root html;
        #设置图片的缓存时间
        expires 1d;
        }

1.7、回收TIME_WAIT:

TIME_WAIT是tcp连接当中的一种状态。出现在四次挥手之后。

处于等待状态,双方不再发送数据。

TIME_WAIT所占用的系统资源很小,数量比较少,完全可以忽略不计。

但是太多了,就有一定的影响。

连接断开(四次挥手)之后,尽快的把time_wait状态尽快回收。

在这里插入图片描述

netstat -n | awk '/^tcp/ {++s[$NF]} END {for (a in s) print a s[a]}'           #统计当前系统的连接状态
ESTABLISHED2

#统计当前系统的连接状态

vim /etc/sysctl.conf

net.ipv4.tcp syncookies=1
#防止tcp的半连接队列溢出。可以达到服务端在收到tcp的syn同步的请求时能够>快速响应。
net.ipv4.tcp_tw_reuse=1
#允许复用time_wait状态的连接,新的连接可以直接使用time_wait状态的端口,
可以提高连接的重用率。
net.ipv4.tcp_tw_recyle=1
#这个是老版本配置,时间戳戳记进行连接复用。
net.ipv4.tcp_fin_timeout=30
#控制time_wait状态的持续时间,持续30s,不是立即把time_wait的连接收回。>
而是尽可能的把time_wait状态的进行挥手,没用的空闲的,进行回收

总结:nginx

  1. 隐藏版本号
  2. 日志分割
  3. cpu绑定
  4. 连接超时
  5. 页面压缩
  6. 页面缓存时间
  7. time_wait状态的回收

二、nginx的防盗链

   location ~* \.(gif|jpg)$ {
    valid_referers none blocked *.xy102.com xy102.com;
    #允许xy102.com的网址访问图片。
    if ( $invalid_referer ) {
  rewrite ^/ http://www.xy102.com/error.png;
    #如果不是xy102.com访问,一律跳转到盗链的提示
    }
 }

在这里插入图片描述

在这里插入图片描述

重定向之后进入死循环。

在这里插入图片描述

没有对防盗图片匹配,直接跳过防盗,进入一般字符匹配

在这里插入图片描述

正确防盗格式;

在这里插入图片描述

没有对进行防盗路径,直接盗用。

在这里插入图片描述

返回码403

在这里插入图片描述

网页准备:
Web源主机(192.168.233.61)配置:
cd /usr/local/nginx/html
将game.jpg、error.png文件传到/usr/local/nginx/html目录下
vim index.html
...... 
<img src="game.jpg"/>
</body>
</html>

echo "192.168.233.61 www.kgc.com" >> /etc/hosts 
echo "192.168.233.62 www.benet.com" >> /etc/hosts 

盗链网站主机(192.168.233.62):
cd /usr/local/nginx/html
vim index.html
...... 
<img src="http://www.kgc.com/game.jpg"/>
</body>
</html>

echo "192.168.233.61 www.kgc.com" >> /etc/hosts 
echo "192.168.233.62 www.benet.com" >> /etc/hosts 

在盗图网站主机上进行浏览器验证
http://www.benet.com

lmp+DISCUZ

论坛的一个服务

l linux操作系统

n nginx前端页面的web服务

php 动态请求转发的中间件

m mysql 数据库 保存用户和密码,以及论坛的相关内容。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

[client]
port = 3306
#客户端访问的端口
socket=/usr/local/mysql/mysql.sock
#指定mysql的通信套接字文件
[mysqld]
user = mysql
basedir=/usr/local/mysql
#mysql的安装目录
datadir=/usr/local/mysql/data
#mysql数据保存的目录
port = 3306
#服务端的端口
character-set-server=utf8
#字符集的编码
pid-file = /usr/local/mysql/mysqld.pid
socket=/usr/local/mysql/mysql.sock
bind-address = 0.0.0.0
#任意地址都可以访问数据库
skip-name-resolve
max_connections=2048
default-storage-engine=INNODB
#mysql默认的存储引擎
max_allowed_packet=16M
server-id = 1
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
#mysql支持的数据类型和相关的模块

在这里插入图片描述

#设置环境变量,申明/宣告mysql命令便于系统识别
[root@mysql1 mysql]# echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
[root@mysql1 mysql]# source /etc/profile

#初始化数据库:
[root@mysql1 mysql]# cd /usr/local/mysql/bin/
cd /usr/local/mysql/bin/
./mysqld \
--initialize-insecure \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data


yum -y install gd \
libjpeg libjpeg-devel \
libpng libpng-devel \
freetype freetype-devel \
libxml2 libxml2-devel \
zlib zlib-devel \
curl curl-devel \
openssl openssl-devel \
oniguruma-devel \
sqlite-devel
./configure \
--prefix=/usr/local/php \
--with-mysql-sock=/usr/local/mysql/mysql.sock \
#声明好mysql通信套接字的位置,能和数据库进行通信
--with-mysqli \
--with-zlib \
--with-curl \
--with-gd \
--with-jpeg-dir \
--with-png-dir \
--with-freetype-dir \
--with-pdo-mysql \
--with-openssl \
--with-sqlite-devel \
--with-oniguruma-devel \
--enable-fpm \
--enable-mbstring \
--enable-xml \
--enable-session \
--enable-ftp \
--enable-pdo \
--enable-tokenizer \
--enable-zip
--prefix=/usr/local/php: 指定PHP的安装目录为/usr/local/php。
--with-mysql-sock=/usr/local/mysql/mysql.sock: 指定MySQL的Unix socket文件路径,用于与MySQL数据库建立连接。
--with-mysqli: 启用MySQLi扩展,用于支持MySQL数据库。
--with-zlib: 启用Zlib库,用于压缩和解压缩数据。
--with-curl: 启用cURL库,用于支持对URL的操作,如下载文件等。
--with-gd: 启用GD库,用于处理图像。
--with-jpeg-dir: 指定JPEG库的路径,用于GD库对JPEG格式图片的处理。
--with-png-dir: 指定PNG库的路径,用于GD库对PNG格式图片的处理。
--with-freetype-dir: 指定FreeType库的路径,用于GD库对字体的支持。
--with-openssl: 启用OpenSSL库,用于支持SSL加密和HTTPS协议。
--enable-fpm: 启用PHP-FPM(FastCGI Process Manager),用于提供更高效的PHP进程管理和请求处理。
--enable-mbstring: 启用多字节字符串支持,用于处理多字节字符集的操作。
--enable-xml: 启用XML支持,用于处理XML文档和数据。
--enable-session: 启用会话支持,用于在不同页面间保持用户会话状态。
--enable-ftp: 启用FTP支持,用于对FTP服务器进行操作。
--enable-pdo: 启用PDO(PHP Data Objects),用于支持数据库访问的统一接口。
--enable-tokenizer: 启用Tokenizer扩展,用于对字符串进行分词处理。
--enable-zip: 启用Zip扩展,用于对ZIP文件进行操作。

[root@nginx1 php-8.1.27]# ln -s /usr/local/php/bin/* /usr/local/bin/
[root@nginx1 php-8.1.27]# ln -s /usr/local/php/sbin/* /usr/local/sbin/

php有三个配置文件

php.ini 主配置文件

php-fpm.conf 进程服务的配置文件

www.conf 扩展配置文件

主配置文件

976

1181行

进程配置文件

cp 之后再改

/usr/local/php/sbin/php-fpm -c /usr/local/php/lib/php.ini

在这里插入图片描述

<?php
$link=mysqli_connect('192.168.233.61','bbsuser','admin123');
if($link) echo "<h1>Success!!</h1>";
else echo "Fail!!";
?>

三、nginx的重定向(rewrite)

location 匹配

location 匹配的就是后面的URI

/wordpress

192.168.168.30/woordpress

location匹配的分类和优先级*

1、精确匹配

location = / 对字符串完全匹配,必须完全符合。


location = /1.png {

	root   /data/nginx/static1;

	index  index.html index.htm;

}

2、正则匹配

^~`前缀匹配,以什么为开头

`~`区分大小写的匹配

`~*`不区分大小写

`!~`:区分大小写的取反

`!~*`:不区分大小写的取反

location ~* \.(png|jpg)$ {

	root   /data/nginx/static3;

	index  index.html index.htm;

}

3、一般匹配

location /字符串


location /1.png {
            root   /data/nginx/static2;
            index  index.html index.htm;
        }

实验

精确匹配的优先级最高,其次是正则,最后是一般。和代码先后无关。

在这里插入图片描述

location = /1.png {

	root   /data/nginx/static1;

	index  index.html index.htm;

}

location /1.png {
            root   /data/nginx/static2;
            index  index.html index.htm;
        }
location ~* \.(png|jpg)$ {

	root   /data/nginx/static3;

	index  index.html index.htm;

}

优先级总结:

location = 完整路径  >  location ^~ >location ~ location ~* >location /部分起始位置 > location / 一般字符串

实际网站中的使用规则:

网站首页

location = / {

root html;##默认是/usr/local/nginx/html或者也可以是自定义的目录

index index.html index.htm index.php;

}

第二个必选的规则:处理静态请求的页面

location ^~ /static/ {

​	root /web/static/;

index index.html index.htm;

}

用来匹配静态页面

访问图片或者是指定的后缀名

location ~* \ .(jpg|gif|png|peg|css)$ {

root /web/pictures/;

index index.html index.htm index.php;

}

访问图片或者是指定的后缀名

一般是通用规则,用来转发.php .js 为后缀的动态请求到后端服务器(数据库)

第三个规则,一般是通用规则,用来转发.php .js 为后缀的动态请求到后端服务器(数据库)

location / {

proxy_pass

}

转发后端请求和负载均衡

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

rewrite重定向:

rewrite就是把当前访问的页面跳转到其他页面。

rewrite的工作方式:通过nginx的全局变量或者自定义变量,结合正则表达式和标志位实现url的重定向。

nginx的变量

$uri 客户端请求的uri地址

$host:请求的主机名

$http_user_agent:客户端请求的浏览器和操作系统。

$http_referer:请求头的referer信息,表示当前页面来源的url

$remote_addr:客户端的ip地址
$remote_port: 客户端的端口号
$server_addr: 服务端的ip地址
$server_port: 服务端的端口号

$request_method:获取客户端请求的方法

$scheme:请求的协议,要么是http要么是https

x_forwarded_for:用来获取请求头当中客户端的真实ip地址。代理服务器添加,在代理服务器当中只是客户端的ip地址。

x_Real-IP:客户端真实ip地址。

nginx.conf

proxy_set_header X-Real-IP $remote_addr加上这一字段,客户端必须带上真实ip地址传递给后端服务器。

在这里插入图片描述

在这里插入图片描述

location / {
            root   html;
            index  index.html index.htm;
        default_type text/plain;
        #默认文本类型设置为text/plain
        return 200 "ip:$remote_addr\ntest1:$host\nport:$remote_port";
        ##返回一个HTTP 200状态码,并在响应体中包含客户端的IP地址,请求的主机,以及端口
        }

[root@test3 ~]#curl 192.168.168.10
ip:192.168.168.30
test1:192.168.168.10
port:40042

标志位:flag

permanent:永久重定向,返回码是301,浏览器地址栏会显示跳转后的URL地址。

redirect:临时重定向,返回码是302,浏览器地址栏会显示跳转后的URL地址。

break:永久重定向,返回码也是301,但是他匹配到规则之后不会再向下匹配规则,URL也不会发送变化。

last:重定向,但是会继续向下匹配其他的location规则。

rewrite的执行顺序:

1、server模块的rewrite的优先级最高

2、匹配location的规则

3、执行选定的location规则。

rewrite的语法:

rewrite 正则表达式 跳转后的内容 标志位;

永久

在这里插入图片描述

在这里插入图片描述

 location / {
            root   html;
        rewrite /test1/(.*) /xy102/$1 permanent;
       ## $1==(.*)
          index  index.html index.htm;
        }

临时

在这里插入图片描述

在这里插入图片描述

 location / {
            root   html;
        rewrite /test1/(.*) /xy102/$1 redirect;
          index  index.html index.htm;
        }

break

在这里插入图片描述

在这里插入图片描述

 location / {
            root   html;
        rewrite /test1/(.*) /xy102/$1 break;
          index  index.html index.htm;

last

在这里插入图片描述

location / {
            root   html;
        rewrite /test1/(.*) /xy102/$1 last; 
          index  index.html index.htm;
        }
location /test1 {
            root   html;
        rewrite /test1/(.*) /xy102/$1 last;
          index  index.html index.htm;
        }
         location /xy102 {
            root   html;
        rewrite /xy102/(.*) /test1/$1 last;
          index  index.html index.htm;
        }

rewrite or internal redirection cycle while processing?

在重定向的过程中,使用了last方式进行重定向,但是,没有结束语,陷入了死循环,nginx会自动循环10次,last匹配最多只能执行10次,超过10次没有结束,就会停止,然后报错500。
在这里插入图片描述

location /test1 {
            root   html;
        rewrite /test1/(.*) /xy102/$1 last;
          index  index.html index.htm;
        }
         location /xy102 {
            root   html;
        rewrite /xy102/(.*) /test1/$1 break;
          index  index.html index.htm;
        }

在这里插入图片描述

实验1:

基于域名进行跳转,老的不用,但是依然能够访问,统统跳转到新的域名

在这里插入图片描述

在正则表达式中,`(.*)` 是一个捕获组的示例,用于匹配并捕获任意长度的任意字符(除了换行符,除非使用了特定的模式修饰符,如 `s` 或 `m`,来允许`.`匹配换行符)。

这里的 `.*` 部分解释如下:

- `.` 表示匹配除换行符之外的任意单个字符。
- `*` 表示匹配前面的字符(在这个例子中是`.`)零次或多次。

因此,`(.*)` 可以匹配并捕获一个字符串中的任意部分,从起始位置到结束位置,或者任何两个特定字符(如果正则表达式中有这些特定字符的话)之间的任意内容。

例如,在正则表达式 `foo(.*)bar` 中,`(.*)` 会匹配并捕获 `foo` 和 `bar` 之间的任意字符(包括零个字符)。

- 如果字符串是 `"foobar"`,则捕获组将不捕获任何内容(因为 `foo` 和 `bar` 之间没有字符)。
- 如果字符串是 `"foo123bar"`,则捕获组将捕获 `"123"`。

捕获组在正则表达式中非常有用,因为它们允许你提取和操作匹配到的特定部分。在大多数编程语言中,你可以通过特定的方法或函数来访问这些捕获组的内容
location / {
            root   html;
        if ( $host = 'www.xy102.com' ) {
        rewrite ^/(.*)$ http://www.jd.com/$1 permanent;
        } 
          index  index.html index.htm;
        }

在这里插入图片描述

资源不变,都是一样的。

实验2:基于客户端的ip进行跳转 公司有新业务上线,测试阶段,其他的ip只能显示维护中,只有192.168.168.20能正常访问

##set $rewrite ture

#设置一个变量名,rewrite,值是true

##来进行判断ip是否合法ip

set $rewrite true;
        #设置一个变量名,rewrite,值为true
        if ( $remote_addr = "192.168.168.20") {
                set $rewrite false;
        }
        if ( $rewrite = true ) {
        rewrite (.+) /error.html;
        }
        location = /error.html {
        root html;
        }

在这里插入图片描述

在这里插入图片描述

意思为若是192.168.168.20访问nginx.conf配置主机,就显示index.html

若是其他进行访问,显示error.html

扩展实验3基于目录下所有 php 结尾的文件跳转

vim /usr/local/nginx/conf/nginx.conf

server {
	listen       80;
	server_name  www.test.com;		#域名修改	
	charset utf-8;
	access_log  /var/log/nginx/www.test.com-access.log;
	

location ~* /upload/.*\.php$ {
    rewrite (.+) http://www.test.com permanent;
}

location / {
    root   html;
    index  index.html index.htm;
}

}

systemctl restart nginx

访问http://www.test.com/upload/123.php,直接跳转到www.test.com

四、nginx的正向代理

正向代理以及缓存配置:

代理:客户端不再是直接访问服务端,通过代理服务器访问服务端。

正向代理作用:面向客户端,我们通过代理服务器的ip地址访问目标服务端。

服务端只知道代理服务器的定制,真正的客户端ip可以隐藏。

科学上网。

在这里插入图片描述
在代理服务器上配置代理地址,访问代理服务器就是访问192.168.233.62
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

   server {
        listen       8888;
        server_name  localhost;
        resolver 218.2.135.1 valid=300 ipv6=off;
#设置dns解析地址,解析器的缓存时间300秒,每300秒重新解析一次,关闭ipv6
      resolver_timeout 3s;
 #解析超时的时间3秒
     proxy_read_timeout 30s;
    #读取代理服务器的超时时间,30s,默认是60s.
     proxy_send_timeout 30s;
    #向服务端发送数据的超时时间是30s,默认是60s.
      proxy_connect_timeout 30s;
    #和服务器建立连接的超时时间,30s,默认也是60s
    charset utf-8;
    #access_log  logs/host.access.log  main;
    set $url "www.baidu.com";
    #location = /1.png {
     #   root   /data/nginx/static1;
      #  index  index.html index.htm;
    #}
    location / {
        root   html;
      index  index.html index.htm;
       proxy_pass  http://$url;
        #需要把客户端的真实ip,客户端的主机名,客户端的请求方式,服务端的端口,真实的ip地址添加在请求头当中
        #       # 请求转发到$url的地址,通过代理服务器地址可以直接访问百度 http://$url:端口
        #              # 设置页面的缓存:
                              proxy_buffers 256 4k;
        #                             #设置缓冲区为256个,大小是4k
                                             proxy_max_temp_file_size 0;
        #                                            # nginx服务器做为代理的时候暂时存放的响应数据的最大临时文件的大小为0,不使用临时文件
                                                            proxy_cache_valid 200 302 1m;
        #                                                           #当状态吗是200和302时,缓存的有效期是1分钟
                                                                           proxy_cache_valid 301 1h;
        #                                                                          #当状态吗是301,缓存的有效期是1小时
                                                                                          proxy_cache_valid any 1m;
        #                                                                                         #除了上述的三个状态吗,其他的缓存保存时间1分钟。
        #
                                                                                                     }

位置传参

在这里插入图片描述

   server {
        listen       8888;
        server_name  localhost;
        resolver 218.2.135.1 valid=300 ipv6=off;
        #设置dns解析地址,解析器的缓存时间300秒,每300秒重新解析一次,关闭ipv6
        resolver_timeout 3s;
        #解析超时的时间3秒
        proxy_read_timeout 30s;
        #读取代理服务器的超时时间,30s,默认是60s.
        proxy_send_timeout 30s;
        #向服务端发送数据的超时时间是30s,默认是60s.
        proxy_connect_timeout 30s;
        #和服务器建立连接的超时时间,30s,默认也是60s
        charset utf-8;
   
   #access_log  logs/host.access.log  main;

    location / {
        root   html;
        index  index.html index.htm;
        proxy_pass  $scheme://$http_host$request_uri;
        proxy_set_header Host $http_host;
        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-Host $host;
        proxy_set_header X-Forwarded-Port $server_port;
        #需要把客户端的真实ip,客户端的主机名,客户端的请求方式,服务端的端口,真实的ip地址添加在请求头当中
       # 请求转发到$url的地址,通过代理服务器地址可以直接访问百度 http://$url:端口
       # 设置页面的缓存:
        proxy_buffers 256 4k;
       #设置缓冲区为256个,大小是4k
        proxy_max_temp_file_size 0;
       # nginx服务器做为代理的时候暂时存放的响应数据的最大临时文件的大小为0,不使用临时文件
        proxy_cache_valid 200 302 1m;
       #当状态吗是200和302时,缓存的有效期是1分钟
        proxy_cache_valid 301 1h;
       #当状态吗是301,缓存的有效期是1小时
        proxy_cache_valid any 1m;
       #除了上述的三个状态吗,其他的缓存保存时间1分钟。

    }

[root@test1 conf]# vim nginx.conf

 server {
        listen       8888;
        server_name  localhost;
        resolver 218.2.135.1 valid=300 ipv6=off;
#设置dns解析地址,解析器的缓存时间300秒,每300秒重新解析一次,关闭ipv6
      resolver_timeout 3s;

#解析超时的时间3秒

​                    proxy_read_timeout 30s;

#读取代理服务器的超时时间,30s,默认是60s.

​                                    proxy_send_timeout 30s;

#向服务端发送数据的超时时间是30s,默认是60s.

​                                                    proxy_connect_timeout 30s;

#和服务器建立连接的超时时间,30s,默认也是60s

​    charset utf-8;
​    #access_log  logs/host.access.log  main;
​    #location = /1.png {

     #   root   /data/nginx/static1;

      #  index  index.html index.htm;

​    #}
​    location / {
​        root   html;
​      index  index.html index.htm;

 proxy_pass $scheme://$http_host$request_uri;
        #需要把客户端的真实ip,客户端的主机名,客户端的请求方式,服务端的端口,真实的ip地址添加在请求头当中

请求转发到$url的地址,通过代理服务器地址可以直接访问百度 http://$url:端口

设置页面的缓存:

​                              proxy_buffers 256 4k;

#设置缓冲区1为256个,大小是4k

​                                             proxy_max_temp_file_size 0;

nginx服务器做为代理的时候暂时存放的响应数据的最大临时文件的大

小为0,不使用临时文件
                                                            proxy_cache_valid 200 302 1m;

#当状态吗是200和302时,缓存的有效期是1分钟

​                                                                           proxy_cache_valid 301 1h;

#当状态吗是301,缓存的有效期是1小>时

​                                                                                          proxy_cache_valid any 1m;

#除了上述的三个状>态吗,其他的缓存保存时间1分钟。


  
                                                                                                     }


[root@test1 conf]# systemctl restart nginx
[root@test1 conf]# curl -x http://192.168.168.10:8888 http://www.baidu.com

百度一下,你就知道

关于百度 About Baidu

©2017 Baidu 使用百度前必读  意见反馈 京ICP证030173号 

五、nginx的反向代理:

反向代理:

正向代理我们是知道代理服务器的地址,也知道我们访问的web服务器。

反向代理,客户端还是访问的代理地址,但是具体的访问的web服务器是哪一台,我们并不知道。(负载均衡)

在这里插入图片描述

作用:把请求分配打多台服务器上,分担服务器的负载,提高系统的可用性和稳定性。

​ 缓存加速

​ 安全保护

面试题----四层和七层代理之间的区别:

  • 正向代理,http模块的server和location

  • http模块配置都是7层

  • 7层就是应用层,使用的是http协议,可以对请求进行解析和处理,7层代理走的是用户态,应用协议和程序功能。

  • 7层处理的速度相对比较慢,但是可以提供更高级的功能和更好的用户体验。

  • 既可以是域名也可以是ip+端口。

  • 四层是传输层,ip+端口,请求转发到后端,无法对请求进行深入解析和处理,只是对请求流量的转发。

  • 四层转发是内核态,内核转发。内核转发。所以速度比较快。

  • 应用场景:7层代理一般都是对外提供访问,需要对请求进行处理,包括安全,过滤,流量控制。

  • ​ 4层代理,一般是内部使用,不需要对流量,请求做特殊处理。

配置方法以及负载均衡的算法:

反向代理=负载均衡。

配置方法:

  • 七层只能写在http模块当中,命令 upstream,只能在http的大模块中,不能在server也不能在location中

  • 四层只能写在全局配置当中,不能写在http模块当中 `stream

实验

test1 192.168.168.10 代理-----配置反向代理
test2 192.168.168.20 后台服务器
test3 192.168.168.30后台服务器
客户端:谷歌浏览器

在这里插入图片描述

upstream xy102 {
        server 192.168.168.20;
        server 192.168.168.30;
        }

在这里插入图片描述

 location / {
            root   html;
            index  index.html index.htm;
        proxy_pass http://xy102;
        }

解释:

在Nginx配置中,proxy_pass 指令用于将请求转发到另一个服务器或服务器组,这通常用于实现反向代理或负载均衡。当你看到 proxy_pass http://xy102; 这样的配置时,它意味着Nginx会将接收到的请求转发到名为 xy102 的后端服务器或服务器组。

然而,这里有几个需要注意的点:

  1. URL格式:通常,proxy_pass 后面跟的URL应该是完整的,包括协议(如 http://https://)、域名(或IP地址)以及可能的端口号和路径。但是,在你的例子中,http://xy102 看起来像是一个简化的表示。在实际配置中,这通常不是直接有效的,除非Nginx已经通过某种方式(如upstream块)定义了 xy102 作为一个服务器组或服务器别名。

  2. upstream块:在Nginx中,你可以使用 upstream 指令定义一个服务器组,这个组可以包含多个后端服务器。然后,你可以在 proxy_pass 中引用这个服务器组的名字,而不是直接指定服务器地址。例如:

    upstream xy102 {  
        server 192.168.1.102:80;  
        server 192.168.1.103:80 backup;  
    }  
     
    server {  
        listen 80;  
        server_name example.com;  
     
        location / {  
            proxy_pass http://xy102;  
        }  
    }
    

    在这个例子中,xy102 是一个服务器组的名称,该组包含两个服务器:192.168.1.102:80192.168.1.103:80(后者被标记为备用服务器)。

  3. 路径处理:默认情况下,Nginx会将请求中的路径部分附加到 proxy_pass 指令指定的URL之后。但是,如果你不希望这样做(比如,你想要忽略请求的路径,并总是向后端服务器发送相同的请求路径),你可以使用变量 $uri 来控制这一点,或者在URL的末尾添加斜杠(/)。

  4. 安全性:当使用 proxy_pass 时,请确保后端服务器的安全性,特别是如果它们是公开可访问的。此外,考虑使用HTTPS来保护客户端和后端服务器之间的通信。

  5. 调试:如果配置不起作用,检查Nginx的错误日志以获取更多信息。这可以帮助你诊断问题,比如配置语法错误或后端服务器无法访问。

总之,proxy_pass http://xy102; 这样的配置通常需要在Nginx配置的其他部分(如 upstream 块)中有相应的定义或解释。如果 xy102 不是一个有效的URL或未在Nginx配置中定义,那么这条指令将不会按预期工作。

负载均衡的算法:

1、轮询 round robin rr:轮询算法是最简单也是最基础的算法,也是默认速发,请求轮流分配到后端服务器。

轮询算法适用于后端服务器能力相同的情况,访问量不大的情况。默认算法,可以不加。

2、加权轮询:在轮询的基础之上,给每个后台服务器设置不同的权重。流量的分配不一定是按照权重比来。

权重高的被转发的概率大,权重低的相对较小。

后端服务器的有差异,权重相对更高,性能低,权重相对小一些。

weight

在这里插入图片描述

upstream xy102 {
        server 192.168.168.20 weight=2;
        server 192.168.168.30 weight=1;
        }

3、最小连接数算法,least_conn会把请求发送到当前连接数较少的后端服务器上。

后端服务器处理任务耗时不同的情况,可以避免请求集中在处理能力更强的服务器上。

在这里插入图片描述在这里插入图片描述

upstream xy102 {
		least_conn;
        server 192.168.168.20 weight=2;
        server 192.168.168.30 weight=1;
        }

面试题4、ip_hash*怎么做会话保持?

  • ip_hash根据算法,计算客户端的ip地址的hash值,然后请求转发到相应的服务器。

  • 在第一次访问网址之时,就会计算出这个hash值,会把请求分到一个服务器,但是下一次客户端如果使用相同的ip地址再次访问,就不再分配到其他的服务器,除非后台服务器的算法变更,或者后台的服务器数量发送了变化,这时才会更改访问的服务器。

  • 适用场景,高并发。如果说客户端进来之后,不停的轮换服务器,反而会加重服务器的负担,固定在一台服务器上,降低了代理服务器的压力。同时也节约了资源。

  • nginx当中怎么实现会话保持

  • ip_hash可以实现会话保持

  • sessionc动态页面里面配置会话。

在这里插入图片描述

upstream xy102 {
        ip_hash;
        server 192.168.168.20 weight=2;
        server 192.168.168.30 weight=1;
        }

5、URL_hash 根据请求的url地址来计算hash值,然后再转发,如果每次的请求url都一样,就会被分配到同一个服务器。

转发的地址发送变化,后台服务器清理缓存或后台服务器的数量发送变化。

在这里插入图片描述

以上都是七层当中使用的,四层没有ip_hash和url_hash的算法。

实验1基于域名实现负载均衡

test1 www.test.com 代理-----配置反向代理
test2 www.test1.com 后台服务器
test3 www.test2.com后台服务器
客户端:虚拟机

 server_name  www.test.com;



 upstream xy102 {
        server www.test1.com weight=2;
        server www.test2.com weight=1;
        }



 location / {
            root   html;
            index  index.html index.htm;
        proxy_pass http://xy102;
        }


test1\2\3做映射



vim /etc/hosts

192.168.168.20 www.test1.com
192.168.168.30 www.test2.com
192.168.168.10 www.test.com



在这里插入图片描述

在这里插入图片描述

四层代理:只能在全局模块,算法比较少,只能是ip+端口
在这里插入图片描述

这里的端口被http的80端口占用。

在这里插入图片描述



stream {
#四层代理
        upstream test {
        server 192.168.168.20:8081;
        server 192.168.168.30:80;
        #全局代理只能ip+端口
        }
        server {
        listen 81;
        proxy_pass test;
        }
        }

主机192.168.168.20端口改为8081
主机192.168.168.30端口改为80

1、轮询可以

2、加权可以

在这里插入图片描述

3、最小连接数

least_conn;

在这里插入图片描述

四层没有ip_hash和url_hash的算法。

nignx的优化

nginx的location的匹配以及重定向

nginx的正向代理以及反向代理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1904968.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习训练之使用静态图加速

前言 MindSpore有两种运行模式&#xff1a;动态图模式和静态图模式。默认情况下是动态图模式&#xff0c;也可以手工切换为静态图模式。 动态图模式 动态图的特点是计算图的构建和计算同时发生&#xff0c;符合Python的解释执行方式。在调试模型时较为方便&#xff0c;能够实…

科大讯飞-群聊对话角色要素提取:不微调范式模拟官网评分

不微调范式模拟官网评分 step1: 模型api配置及加载测试step2: 数据加载与数据分析&#xff1a;测试集分析:step3: prompt设计:step4 :大模型推理&#xff1a;step 5: 结果评分测试&#xff1a;评分细则&#xff1a;评估指标 参考&#xff1a; 比赛说明&#xff1a; #AI夏令营 #…

从打印到监测:纳米生物墨水助力3D生物打印与组织监测平台?

从打印到监测&#xff1a;纳米生物墨水助力3D生物打印与组织监测平台&#xff1f; 在 3D 组织工程中&#xff0c;纳米生物墨水是将纳米材料与 ECM 水凝胶结合&#xff0c;以提高其打印性和功能性的重要策略。纳米生物墨水可以增强水凝胶的机械性能、导电性、生物活性&#xff…

【Transformer】transformer模型结构学习笔记

文章目录 1. transformer架构2. transformer子层解析3. transformer注意力机制4. transformer部分释疑 图1 transformer模型架构 图2 transformer主要模块简介 图3 encoder-decoder示意图N6 图4 encoder-decoder子层示意图 1. transformer架构 encoder-decoder框架是一种处理NL…

卷积神经网络基础篇

文章目录 1、卷积层1.1、激活函数1.3、sigmoid1.4、Tanh1.5、ReLU1.6、Leaky ReLU1.7、误差计算 2、池化层3、全连接层4、CNN训练 参考链接1 参考链接2 1、卷积层 卷积层&#xff08;Convolutional layer&#xff09;&#xff0c;这一层就是卷积神经网络最重要的一个层次&…

数据库的学习(4)

一、题目 1、创建数据表qrade: CREATE TABLE grade(id INT NOT NULL,sex CHAR(1),firstname VARCHAR(20)NOT NULL,lastname VARCHAR(20)NOT NULL,english FLOAT,math FLOAT,chinese FLOAT ); 2、向数据表grade中插入几条数据: (3,mAllenwiiliam,88.0,92.0 95.0), (4,m,George&…

java版企业工程管理系统源码:全方位的项目管理解决方案

工程管理系统是一款专注于建设工程项目全生命周期管理的软件。它覆盖了项目从策划、设计、施工到竣工的每一个阶段&#xff0c;提供全方位的管理功能。系统采用模块化设计&#xff0c;包括系统管理、系统设置、项目管理、合同管理、预警管理、竣工管理、质量管理、统计报表和工…

centos7.9 rpm包安装mysql8.2.0数据库、root设置客户端登录、配置并发、表名大小写敏感、启动重启指令等记录

centos安装mysql8数据库,下载的是rpm-bundle.tar包,这样可以在内网环境离线安装,工作中医院的服务器很多也是内网的,所以这里记录下rpm-bundle.tar包安装的步骤。 lscpu 查看处理器是x86还是arm 下载对应的版本 bundle tar包 ((mysql-8.2.0-1.el7.x86_64.rpm-bundle.tar))…

打造属于你的私人云盘:在 OrangePi AIpro 上搭建个人云盘

随着数字化时代的到来&#xff0c;数据的存储和管理变得愈发重要。相比于公共云存储服务&#xff0c;搭建一个属于自己的个人云盘不仅能够更好地保护隐私&#xff0c;还可以更灵活地管理数据。 近期刚好收到了一个 香橙派 AIpro 的开发板&#xff0c;借此机会用来搭建一个属于…

《算法笔记》总结No.4——散列

散列的英文名是hash&#xff0c;即我们常说的哈希~该知识点在王道408考研的教材里面属于查找的范围。即便各位并无深入了解过&#xff0c;也听说过散列是一种更高效的查找方法。 一.引例 先来考虑如下一个假设&#xff1a;设有数组M和N分别如下&#xff1a; M[10][1,2,3,4,5,6…

idea 默认路径修改

1.查看 idea 的安装路径&#xff08;右键点击 idea 图标&#xff0c;查看路径 &#xff09; “C:\Program Files\JetBrains\IntelliJ IDEA 2021.3.1\bin\idea64.exe” 在 bin 目录查看 idea.properties 文件&#xff0c;修改以下四个路径文件 # idea.config.path${user.home}/…

对话大模型Prompt是否需要礼貌点?

大模型相关目录 大模型&#xff0c;包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步&#xff0c;扬帆起航。 基于Dify的QA数据集构建&#xff08;附代码&#xff09;Qwen-2-7B和GLM-4-9B&#x…

QT入门笔记-自定义控件封装 30

具体代码如下: QT core guigreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c17# You can make your code fail to compile if it uses deprecated APIs. # In order to do so, uncomment the following line. #DEFINES QT_DISABLE_DEPRECATED_BEFORE0x060000 …

uni-app使用ucharts地图,自定义Tooltip鼠标悬浮显示内容并且根据@getIndex点击事件获取点击的地区下标和地区名

项目场景&#xff1a; uni-app使用ucharts地图,自定义Tooltip鼠标悬浮显示内容并且根据getIndex点击事件获取点击的地区下标和地区名 例如&#xff1a; 问题描述 官方给的文档有限&#xff0c;需要自己下载地图json数据然后自己渲染和编写鼠标悬浮显示内容以及获取点击地址…

【ComfyUI节点】扰动注意力引导Perturbed Attention Guidance

扰动注意力引导 Perturbed Attention Guidance GitHub - KU-CVLAB/Perturbed-Attention-Guidance: Official implementation of "Perturbed-Attention Guidance" 按照官方介绍&#xff0c;扰动注意力指导显著提高了扩散模型的样本质量&#xff0c;而无需外部条件&am…

代码随想录第45天|动态规划

300.最长递增子序列 参考 dp[i] 表示以 i 为结尾的最长递增子序列长度递推公式: 使用 i 和 j 判断 dp[i] max(dp[j] 1, dp[i])每次 j 都需要从头遍历 初始化: dp[i] 1 class Solution { public:int lengthOfLIS(vector<int>& nums) {vector<int> dp(nums…

鸿蒙开发:Universal Keystore Kit(密钥管理服务)【明文导入密钥(C/C++)】

明文导入密钥(C/C) 以明文导入ECC密钥为例。具体的场景介绍及支持的算法规格 在CMake脚本中链接相关动态库 target_link_libraries(entry PUBLIC libhuks_ndk.z.so)开发步骤 指定密钥别名keyAlias。 密钥别名的最大长度为64字节。 封装密钥属性集和密钥材料。通过[OH_Huks_I…

实现antd designable平台的组件拖拽功能

平台&#xff1a;designable设计器 github&#xff1a;designable 目录 1 背景2 技术栈3 组件拖拽和放置3.1 类型定义3.2 拖拽3.3 放置 1 背景 由于业务需求&#xff0c;我们需要实现designable平台的一个简易版的组件拖拽功能。 #mermaid-svg-QrxSDGe9YyGG3LbQ {font-family:…

andboxie-Plus - 知名沙盒软件、支持游戏多开测试软件

我们经常会需要用到一些毒瘤软件——它们可能不是真正的恶意软件&#xff0c;但总爱偷摸干一些流氓行为。 工作中&#xff0c;有时还不得不安装使用一些来路不明、不能完全信任的可疑软件。 装上吧&#xff0c;心里膈应、难受&#xff1b;不装吧&#xff0c;有些工作又进行不…

SQLite 嵌入式数据库

目录&#xff1a; 一、SQLite 简介二、SQLite 数据库安装1、安装方式一&#xff1a;2、安装方式二&#xff1a; 三、SQLite 的命令用法1、创建、打开、退出数据库&#xff1a;2、编辑数据库&#xff1a; 四、SQLite 的编程操作1、打开 / 创建数据库的 C 接口&#xff1a;2、操作…