NGINX基础

163 阅读12分钟

nginx 的安装

登录官网 nginx.org/en/download… 选择要安装的版本,右键,复制链接地址

wget http://nginx.org/download/nginx-1.20.2.tar.gz

创建文件夹

mkdir /nginx/core

移动安装包

mv 安装包 /nginx/core

二、配置 在 core 文件夹下

./configure

然后依次执行

make
make install

完成后 nginx 简单安装完成 环境安装

yum install -y gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel

安装位置:/usr/local/nginx

三、启动nginx

cd /usr/local/nginx/sbin
./nginx

在浏览器输入ip地址即可显示 Welcome to nginx

若没有则关闭防火墙再次尝试

通过 yum安装

yum install yum-utils

vim /etc/yum.repos.d/nginx.repo

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
yum -y install nginx

查找nginx安装位置

whereis nginx

查看已安装的服务

 rpm -qa | grep mysql

查看安装服务的配置信息 可以比较两种安装方式的差异

cd /usr/sbin
./nginx -V

卸载nginx

cd /usr/sbin

#将nginx的进程关闭

./nginx -s stop

将安装的nginx删除

rm -rf /usr/local/nginx

清除编译环境

make clean 

nginx命令配置到系统环境

修改/etc/profile文件

vim /etc/profile

在最后一行添加

export PATH=$PATH:/usr/local/nginx/sbin

使之立即生效

source /etc/profile

完成时候即使不在sbin目录下,也可以来控制nginx服务

查看部分日志

查看日志,每访问或刷新一次就会生成一条新的记录

tail -f nginx/logs/access.log 

错误日志,若访问 http://192.168.92.5/a 会显示404,错误日志会增加一条

tail -f nginx/logs/error.log

日志中的变量

$remote_addr	  客户端ip $1
$time_local		时间	$4
$request		请求URL$7
$status			返回的状态码$9
$body_bytes_sent	$10

信号

可查询到 pid

ps -ef | grep nginx 

强制停止

kill -TERM pid 

优雅关闭

kill -QUIT pid

在nginx不启动的情况下,加载最新的nginx配置文件

kill -HUP pid

重新打开日志文件 先删除日志文件

rm -rf access.log erroe.log

每次都要查询pid,比较麻烦可以使用下面的方法 反引号中结果会作为参数

 kill -USR1 `more /usr/local/nginx/logs/nginx.pid`

执行之后日志文件会重新出现

USR2,实现nginx平滑升级 对master pid 执行之后 会生成新的master和worker 而在sbin/logs下会生成nginx.pid和nginx.pid.oldbin

命令行控制

./nginx -s stop ./nginx -s quit ./nginx -s reload ./nginx -c #指定配置文件所在的位置 ./nginx -g #补充nginx指定文件,想nginx服务指定启动时应用全局的配置

nginx服务器升级和新增模块

将新版本编译

 ./configure
 make

将旧版本备份

cd /usr/local/nginx/sbin
mv nginx nginxold  #改名

新版本在编译后在objs文件夹下会有一个nginx可执行文件 进入新版本的安装目录,将可执行文件拷贝

cd objs
cp nginx /usr/local/nginx/sbin

此时在sbin下会有nginx和nginxold两个可执行文件 发送信号USR2给旧版本对应的master进程

kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`

通过 ps -ef | grep nginx 查看 会有两个master和两个worker 而且在/usr/local/nginx/logs 下会有一个nginx.pid.oldbin,对应的是旧版本的pid 发送信号QUIT给旧版本对应的master进程

kill -QUIT `more /usr/local/logs/nginx.pid.oldbin`

安装完成

使用make命令完成升级

步骤同上前半部分,在将新版本nginx可执行文件拷贝到 /usr/loacl/nginx/sbin 后 返回上一级目录 cd .. 后执行

make upgrade

安装完成

添加模块 在安装目录下root/nginx/core/nginx-1.20.2 ./configure --without ./configure --withmake 在objs下会生成一个可执行文件 将可执行文件拷贝到 /usr/local/nginx/sbin/usr/local/nginx执行

make upgrade

完成

将nginx配制成系统服务

在/usr/lib/systemd/system目录下添加nginx.service

[Unit]
Description=nginx web service
Documentation=http://nginx.org/en/docs/
After=network.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
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
PrivateTmp=true
[Install]
WantedBy=default.target	

命令

启动: systemctl start nginx
停止: systemctl stop nginx
重启: systemctl restart nginx
重新加载配置文件: systemctl reload nginx
查看nginx状态: systemctl status nginx
开机启动: systemctl enable nginx

user指令,实现访问指定用户下的网页

初始化配置文件

sed -e '/.*#/d' nginx.conf.default -e '/^$/d' > null

指定用户后可在ps -ef | grep nginx的worker process看到相关用户

在这里插入图片描述

配置

[root@wzb conf]# cat nginx.conf
user  wzb;  #指定用户,否则会报错
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	/home/wzb/html;  #指定文件所在目录,绝对路径
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

输入ip地址访问即可

但是reload之后遇到了这样的问题

nginx: [error] invalid PID number "" in "/usr/local/nginx/logs/nginx.pid"

发现不是缺少 nginx.pid 而是 logs 下 nginx.pid 为空 通过ps查看 pid

ps -ef | grep nginx

在这里插入图片描述 右边的 24262 是pid,将pid拷贝到 logs下的 nginx.pid 重新启动 在浏览器输入ip即可访问制定用户下的html

master_process

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

添加命令:master_process off; 保存退出

./nginx -t
./nginx -s reload

用ps查看发现master还在 停止nginx服务再启动

./nginx -s stop
./nginx

再查看发现master已关闭 在工作中一般使用默认就可以

work_process

work_process 用于配置nginx生成工作进程的数量 但是这个值的设定收到服务器的限制,建议将数值改为和cpu的内核数一致 在这里插入图片描述 停止nginx再启动 ps查看,发现会生成两个work进程

deamon

deamon 是设定 nginx 是否以守护进程的方式启动 守护式进程是linux后台执行的一种服务进程,特点是独立于控制终端,不会随着终端关闭而停止 在不做任何配置的情况下,nginx会以守护进程的方式启动 在这里插入图片描述 保存,停止,重启 发现无法输入命令行,但是nginx依然在运行 CTRL + C 停止后,发现浏览器无法访问nginx,用ps查看发现nginx已停止运行

include

将之前的配置注释 在这里插入图片描述 在与nginx.conf同级文件夹下创建 main.conf

vim main.conf

在这里插入图片描述 保存退出 打开nginx.conf

include main.conf

因为在同一个目录下,所以不需要指定路径 在这里插入图片描述

./nginx -s reload

发现可以起到之前配置的效果 指定的用户为www,且生成两个worker 在这里插入图片描述

所以include可以使nginx的配置更加灵活

events块

accept_mutex:用来设置nginx网络连接序列化 可以用来解救“惊群”问题,默认开启

multi_accept:用来设置是否允许同时接收多个网络的连接 默认关闭 在关闭状态下,nginx工作进程只能同时接收一个新的连接

woker_connections:用来配置单个worker进程最大连接数

events块配置

在这里插入图片描述

http块

定义MIME-Type

MIME-Type能够识别前段资源请求的类型,需要定义在location下 现需要在浏览器上展示指定的文本字符串或json字符串, 若逻辑非常简单,那么就可以通过这个快速实现

nginx.conf编辑 在这里插入图片描述 在浏览器访问 http://192.168.92.5/get_test 发现页面没有变化,但是会下载一个get_text文件

这是因为在Nginx的配置文件中,默认有两行配置

include mime.types;
defautl_type application/octet-stream;

其中 default_type application/octet-stream;设置就是当接受到请求,会以下载附件的方式返回

若要将文本显示在页面上就要设置default_type 打开配置文件 在location下写入:default_type text/plain

再次刷新即可访问 在这里插入图片描述text/plain只能将引号内的字符串返回 若想将“h1”也解析可改为:default_type text/html 在这里插入图片描述 再次刷新 在这里插入图片描述 返回json字符串 在这里插入图片描述

配置

[root@wzb conf]# cat nginx.conf
user wzb;
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	/home/wzb/html;
            index  index.html index.htm;
        }
		location /get_text{
			default_type text/plain;
			#default_type text/html;
			#default_type text/json;
			#return 200 "{'username':'TOM','age':18}";
			return 200 "<h1>this is nginx</h1>";
		}
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

http块中实现自定义服务日志

access_log:用来设置用户访问日志的相关属性

access_log path [format[buffer=size]]

access_log logs/my.log 写入 在这里插入图片描述 用浏览器访问nginx后,发现原来的access.log不会增加内容,而内容是增加在my.log

log_format:用来指定日志的输出格式

vim nginx.conf

log_format myformat 'this is my format';写入 同时将access_log修改为:access_log logs/my.log myformat myformat 是自定义的一种日志输出格式, 而在access_log后加上就是指定my.logmyformat的形式输出 在这里插入图片描述 保存,重启nginx 刷新页面,并用 tail -f my.log 查看日志 发现输出 this is my format 若要输入像之前默认的一样 在这里插入图片描述 可将log_format修改为:log_format myformat 'this is my format:$http_user_agent'; 在这里插入图片描述 $http_user_agent 指定的就是后半部分

具体配置

[root@wzb conf]# cat nginx.conf
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
	
	log_format myformat 'this is my format 2022.7.23:$http_user_agent';
	access_log logs/my.log myformat;
    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;
        }
    }
}

http其他配置指令

sendfile:可以大大提高nginx处理静态资源的性能 pass

server块和location块

在server块下添加 access_log logs/server.log myformat 在location块下添加 access_log logs/text.log myformat 在这里插入图片描述

访问192.168.92.5http://192.168.92.5/get_json 发现原来的my.log没有更新日志, 而日志则是在server.log中更新 访问 http://192.168.92.5/get_text 发现日志在text.log中更新

从而可知 访问网页产生的日志一般采用就近原则 get_text 下有access_log 那么日志在text.log生成 而get_json下没有,那么就去server块中寻找,若server中也没有,那么应该回去http中寻找

具体配置

[root@wzb conf]# cat nginx.conf
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
	log_format myformat 'this is my format 2022.7.23:$http_user_agent';
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
		access_log logs/server.log;
        location / {
            root   html;
            index  index.html index.htm;
        }

		location /get_text{
			access_log logs/text.log myformat;
			default_type text/html;
			return 200 "<h1>Nginx</h1>";
		}
		location /get_json{
			#这里没有指定日志输出的位置
			default_type application/json;
			return 200 "{'username':'TOM','age':18}";
		}
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

配置实例

项目需求 在这里插入图片描述 在目录创建以下文件 其中,logs下的access.log是自动生成的,不用创建 在这里插入图片描述nginx.conf下将 在外部的配置文件引入(con.d下所有以.conf结尾的文件)

include /home/wzb/www/conf.d/*.conf

设定访问配置的网页生成的日志格式

log_format server1 'format';
log_format server2 'format!!';

在这里插入图片描述

在这里插入图片描述

编辑server1.conf

server{
        listen 8081;  #监听8081也可是其他
        server_name localhost;  #可以是ip地址、域名等
        access_log /home/wzb/www/myweb/server1/logs/access.log server1; #日志文件存放路径
        location /server1/location1{
                root /home/wzb/www/myweb;  #html文件存放路径
                index index_sr1_location1.html; #指定html文件
        }
        location /server1/location2{
                root /home/wzb/www/myweb;
                index index_sr1_location2.html;
        }

        error_page 404 /404.html;  #错误页面
        location = /404.html {
                root /home/wzb/www/myweb;
                index 404.html;
        }
}

其中 /server1/location1 是路径的一部分 完整的路径是 root指定的路径 + location的路径

/home/wzb/www/myweb/server1/location1

 location /server1/location1{
                root /home/wzb/www/myweb;
                index index_sr1_location1.html;
        }

编辑server2,与server1类似 检查重启,在浏览器访问,成功实现相应功能 在这里插入图片描述 在这里插入图片描述

在这里插入图片描述 遇到的一些问题: 在nginx.conf中,要将指定日志输出格式的命令写在 include之前 否则server1.conf等文件无法找到相应的输出格式 在这里插入图片描述

配置

[root@wzb conf]# cat nginx.conf
worker_processes  1;
user root;
events {
    worker_connections  1024;
}
http {
	log_format server1 'format s1';
	log_format server2 'format s2';
	include /home/wzb/www/conf.d/*.conf;

    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;
        }
    }
}

default_server

default_server属性是标识符,用来将此虚拟主机设置成默认主机。所谓 的默认主机指的是如果没有匹配到对应的address:port,则会默认执行 的。如果不指定默认使用的是第一个server。

在这里插入图片描述

server_name 精确匹配配置

在hosts下写入网址

127.0.0.1 www.wzb2369.com

在配置文件的server下编辑 server_name 将 listen改为80 在这里插入图片描述 在windows无法访问 但是在虚拟机中的浏览器可以访问 在这里插入图片描述

server_name 通配符匹配配置

在hosts添加

127.0.0.1  www.wzb2369.com
127.0.0.1  www.wzb2369.cn

在配置文件写入

 server_name   www.wzb2369.*;

在这里插入图片描述 在这里插入图片描述 正则表达式符号 在这里插入图片描述

server_name 正则表达式配置

在配置文件写入

server_name ~^www.\w+.com;
···
return 200 '====>access====>$1'

在这里插入图片描述 在centos访问 www.wzb2369.com 在这里插入图片描述

server_name 匹配执行顺序

在配置文件写入

server {
        listen 80;
        server_name ~www.w+.com$;
        return 200  'success1,zhengze';
    }
    server {
        listen 80;
        server_name www.wzb1.com;
        return 200 'success2,jingque';
    }
    server {
        server_name *.wzb1.com;
        return 200 'success3,tongpeifu1';
}
    server {
        server_name www.wzb1.*;
        return 200  'success4,tongpeifu2';
}
    server {
        listen 80 default_server;
        server_name _;
        return 444 'not found';

在这里插入图片描述 在浏览器访问 在这里插入图片描述 发现返回的是精确匹配的结果 注释精确匹配再次访问 发现顺序为: 精确 前通配 后通配 正则表达 默认

location指令

指定模式 在配置文件写入

server {
        listen 80;
        server_name localhost;
        location /abcd {
                default_type text/plain;
                return 200 "successful";
        }
    }

我将这些代码添加在一个任务之后,发现报错 在这里插入图片描述 都是监听80端口 再删除之前的代码之后就可以访问了,不知道什么原因 这个模式只要开头是abcd就可以访问 在这里插入图片描述 精确匹配 比之前的代码多了一个= 在这里插入图片描述 运行之后发现只能访问 http://192.168.92.5/abcdhttp://192.168.92.5/abcd123 之类的已经无法访问 但是加上 ?p1=123 可以访问,因为=之后的内容是作为变量了 在这里插入图片描述 ~ :用于表示当前uri中包含了正则表达式,并且区分大小写 ~*:用于表示当前uri中包含了正则表达式,并且不区分大小写

\w表示任意一个字符 $表示结尾

    server {
        listen 80;
        server_name localhost;
        location ~^/abcd\w$ {
                default_type text/plain;
                return 200 "successful";
        }
    }

abc加任意一个字符(数字字母下划线)就可以访问 在这里插入图片描述

root和alias指令

显示图片 将图片放在 /usr/local/nginx/html/images1 下 在浏览器 访问 http://192.168.92.5/images1/p1.jpg

        location /images {
                root html;
        }

而将root改为alias就无法访问 若将 root html 改为 /usr/local/nginx/html/images1 就可以访问了 所以 root的处理结果是:root路径+location路径 alias的处理结果是:使用alias路径替换location路径

alias 可以随意指定,而root需要指定存在的路径

        location /images {
                alias /usr/local/nginx/html/images/;
        }

再次访问 http://192.168.92.5/images/p1.jpg 就可以看到

这个方法更清晰

若有错可以看logs/error.log日志文件

index指令

index可以设置网站的默认首页

location /main {
	alias /usr/local/nginx/html/images1;
	index p1.jpg;
}

输入 http://192.168.92.5/main/即可访问

error_page指令

指定具体的跳转地址

在server块下写入 当产生404 错误的时候,页面会跳转到百度

error_page 404 http://www.baidu.com;

在这里插入图片描述 如访问 http://192.168.92.5/images/1这个不存在的页面,就会跳转到百度

指定重定向地址

nginx默认使用

写在server下,感觉这个比较好用

error_page   500 502 503 504  /50x.html;
location = /50x.html {
	root   html;
}

在这里插入图片描述

使用location的@符完成错误提示信息

    server {
        listen 80;
        server_name localhost;
        #error_page 404 http://www.baidu.com;
        error_page 404 @jump_to_error;
        location @jump_to_error {
                default_type text/plain;
                return 404 "Not Found";
        }       
        location /abcde {
                default_type text/plain;
                return 200 "add success";
        }       
        location ~^/abcd\w$ {
                default_type text/plain;
                return 200 "successful";
        }       
        location /images {
                alias /usr/local/nginx/html/images1/;
                index p1.jpg;
        }       
    }

访问 /1这一错误页面即可跳转到Not Found 页面

image-20220424145743814

Nginx 静态资源优化

sendfile

在 html下创建 welcome.html

[root@wzb html]# ls
50x.html  images1  index.html  welcome.html

在浏览器访问

image-20220430110630071

显示访问成功

这就是 访问静态资源的整个过程

tcp_nopush,tcp_nodelay

image-20220514125506254

image-20220514125624038

在 http块下添加

静态资源压缩

gzip

在 配置文件下的 http块下添加gzip on;

在浏览器访问 http://192.168.92.5/ceshi.txt

F12 打开控制器,选中 network

发现文件大小还是3.5KB

pass

image-20220430113406476

在Headers中查看

发现类型是 “text/plain”

image-20220430140520857

在 配置文件中添加

gzip_types	text/plain;

运行之后,再次刷新,发现大小从3.5k变成了1.6k

image-20220430140546288

pass

关闭浏览器的缓存功能:在network下 将Disable cache 打勾

gzip_comp_level

pass

image-20220430141906220

gzip_vary

pass

image-20220430163609137

gzip_buffers

image-20220430163705195

gzip_disable

pass

image-20220430164024466

在 控制台 的Headers 的最后可以看到 User-Agent

image-20220430164128482

在 配置文件 添加 正则

gzip_disable "Mozilla/5.0.*";

若匹配到则不适用gzip

刷新页面可以发现文件没有没压缩

gzip_http_version

pass

image-20220430164802721

gzip_min_length

允许压缩的最小值

image-20220430164948699

在控制台的 Header可看到 Content_length 是文件的大小

设定的比Content=Length大 文件就不会被压缩

gzip_proxied

image-20220430202846003

gzip压缩功能的实例配置

编辑一个单独的文件

[root@wzb conf]# vim nginx_gzip.conf
[root@wzb conf]# cat nginx_gzip.conf 
gzip on;
gzip_types *;
gzip_comp_level 6;
gzip_min_length 1024;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_vary on;
gzip_disable "MSIE [1-6].";
gzip_proxied off; 

在配置文件添加include nginx_gzip.conf来引入

添加模块

/configure --with-http_gzip_static_module

执行make

[root@wzb objs]# cp nginx /usr/local/nginx/sbin/
[root@wzb objs]# cd ..
[root@wzb nginx-1.20.2]# make upgrade

www.bilibili.com/video/BV1ov…

在 http 块下 添加 gzip_static on;

该命令可以找到和要找的资源同名的以.gz结尾的文件

在html目录下 gzip for1.txt

可以解决sendfilegzip共存的问题

之后将 include nginx_gzp.conf注释

访问

image-20220430212120867

执行gzip for1.txt

image-20220430212153766

发现被压缩

浏览器缓存相关指令

强缓存和弱缓存

image-20220514203151033

浏览器清除数据,访问,发现状态码是200 ,大小为原大小,是从服务器获取的文件

image-20220514204204217

重新刷新页面,状态码为304,弱缓存,是检验了文件,是通过if-Modified-SinceIf-None-Match来判断是否发生了修改

image-20220514204343066

并且在 中会多出几行信息

在这里插入图片描述

打开一个新页面,打开控制台输入地址

发现 200 ,但是是灰色,且没有具体的大小,说明是直接从本地读取的文件,是强缓存

在这里插入图片描述

expires

该指令用来控制页面缓存的作用

可以通过该指令控制HTTP应答中的"Expires"和"Cache-Cdntrol"

在这里插入图片描述

在配置文件

任意以.html、js、css、jpg、txt结尾的文件,

1000 表示1000秒

10d 表示10天

location ~ .*.(html|js|css|jpg|txt)$ {
            expires 1000;

        }

运行后在控制台发现多了几行数据

image-20220514202620634

若 expires为负数,那么就会到服务端校验文件是否发生变化,走弱缓存

add_header

add_header指令是用来添加指定的响应头和响应值

image-20220514211935047

在配置文件添加,尝试不缓存, 从服务器读取文件

 location ~ .*.(html|js|css|jpg|txt)$ {
            expires 1000;
            add_header Cache-Control no-store;

        }

多次刷新后,发现都是从服务器获取数据

image-20220514212232410

nginx跨域问题

image-20220515161117933

在html下新建a.html

[root@wzb html]# cat a.html 
<html>
<head>
  <meta charset="utf-8">
  <title>跨域问题演示</title>
  <script src="jquery.js"></script>
    <script>
  $(function(){
  $("#btn").click(function(){  #获取按钮,绑定点击事件
  #function	回调函数	
  #data	响应的数据	
  #若能获取到数据,通过 alert和JSON.srtingify将json数据转为json字符串,并弹出在页面
  $.get('http://192.168.92.5:8080/getUser',function(data){  
  alert(JSON.stringify(data));
        });
                          });
            });
</script>
</head>
<body>
  <input type="button" value="获取数据" id="btn"/> #按钮,id为 “btn
</body>
</html>

访问**http://192.168.92.5:8080/getUser**

在这里插入图片描述

访问**http://192.168.92.5/a.html**

但是点击获取数据没有反应,且报错了

在这里插入图片描述

点击 ConSole 可以看到错误信息,出现了跨域问题导致无法获取数据

在这里插入图片描述

上面的与视频有误

加了error_page就报错?

[root@wzb conf]# cat nginx.conf

user  root;
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;
		charset utf-8;
        location /index.html {
            #root   html;
			alias /usr/local/nginx/html/t1.html;
            #index  index.html index.htm;
			charset utf-8;
        }
	}

	server {
		listen	8080;
		server_name localhost;
		
		location /index.html {
			alias /usr/local/nginx/html/t2.html;
		}
	}

	#error_page   500 502 503 504  /50x.html;
	#location = /50x.html {
	#		root   html;
#	}
}

创建两个html文件

当网页显示乱码

在html文件中

在head下添加

[root@wzb html]# cat t1.html 
<html>
<head>
<meta charset="utf-8">
<title>test1 可以</title>
</head>
<body style="padding: 20px;">
<br/>
	<script type='text/javascript'> 
	    var xmlhttp = new XMLHttpRequest()
		xmlhttp.open("GET", "http://192.168.92.5:8080/index.html", true);
		xmlhttp.send();
	</script>
<p>hello world ...... test1 子域名index.html </p>
</body>
</html>

pas

[root@wzb html]# cat t2.html 
<html>
<head>
<meta charset="utf-8">
<title>test2跨域测试</title>
</head>
	<script type='text/javascript'> 
	    var xmlhttp = new XMLHttpRequest()
		xmlhttp.open("GET", "http://192.168.92.5/index.html", true);
		xmlhttp.send();
	</script>
<body style="padding: 20px;">
<br/>
<p>hello world ...... test2 子域名index.html </p>
</body>
</html>

访问http://192.168.92.5:8080/t2.html 才显示了正确的错误

在这里插入图片描述

解决

[root@wzb conf]# cat nginx.conf

user  root;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;


    sendfile        on;
    keepalive_timeout  65;


    server {
        listen       80;
        server_name  localhost;
		charset utf-8;

		add_header 'Access-Control-Allow-Origin' *;
		add_header 'Access_Control-Allow-Credentials' 'true';
		add_header 'Access-Control-Allow-Methods' *;
		add_header 'Access-Control-Allow-Headers' *;

        location /index.html {
            #root   html;
			alias /usr/local/nginx/html/t1.html;
            #index  index.html index.htm;
			charset utf-8;
        }
	}

	server {
		listen	8080;
		server_name localhost;
		
		add_header 'Access-Control-Allow-Origin' *;
		add_header 'Access_Control-Allow-Credentials' 'true';
		add_header 'Access-Control-Allow-Methods' *;
		add_header 'Access-Control-Allow-Headers' *;


		location /index.html {
			alias /usr/local/nginx/html/t2.html;
		}
	}

	#error_page   500 502 503 504  /50x.html;
	#location = /50x.html {
	#		root   html;
#	}
}

在两个块下都添加

		add_header 'Access-Control-Allow-Origin' *;
		add_header 'Access_Control-Allow-Credentials' 'true';
		add_header 'Access-Control-Allow-Methods' *;
		add_header 'Access-Control-Allow-Headers' *;

再次运行,成功

访问http://192.168.92.5:8080/t2.html也成功

image-20220516150627978

静态资源防盗链

在t1.html中添加两张图片

pass

https://img14.360buyimg.com/n7/jfs/t1/101062/37/2153/254169/5dcbd410E6d10ba22/4ddbd212be225fcd.jpg

双引号中的

https://pics7.baidu.com/feed/cf1b9d16fdfaaf516f7e2011a7cda1e8f11f7a1a.jpeg?token=551979a23a0995e5e5279b8fa1a48b34&s=BD385394D2E963072FD48543030030BB
[root@wzb html]# cat t1.html 
<html>
<head>
<meta charset="utf-8">
<title>test1 可以</title>
</head>
<body style="padding: 20px;">
<br/>
	<script type='text/javascript'> 
	    var xmlhttp = new XMLHttpRequest()
		xmlhttp.open("GET", "http://192.168.92.5:8080/index.html", true);
		xmlhttp.send();
	</script>
<img src="https://img14.360buyimg.com/n7/jfs/t1/101062/37/2153/254169/5dcbd410E6d10ba22/4ddbd212be225fcd.jpg"/><br/>

<img src="https://pics7.baidu.com/feed/cf1b9d16fdfaaf516f7e2011a7cda1e8f11f7a1a.jpeg?token=551979a23a0995e5e5279b8fa1a48b34&s=BD385394D2E963072FD48543030030BB"/> 
<p>hello world ...... test1 子域名index.html </p>
</body>
</html>

访问**http://192.168.92.5/t1.html**发现只显示了一张图片

在这里插入图片描述

我将加入的两段代码交换位置

发现依旧显示手机,不显示汽车,所以是和代码的内容有关,与顺序无关

在这里插入图片描述

将新加的图片添加防盗链

寄了

2022/8/27

[root@wzb conf]# cat nginx.conf
user Andy;
worker_processes  1;

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

	upstream httpds{
		server 192.168.92.170 weight=8 down;
		server 192.168.92.170:8080 weight=2;
		server 192.168.92.170:81 weight=1 backup;
	}

    server {
        listen       80;
        server_name  localhost;

        location / {
			rewrite ^/info$		/docs redirect;
			proxy_pass http://httpds;
        }
		
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
	}
	server {
		listen 88;
		server_name localhost;

		location ~ .*.(png|jpg|gif) {
			valid_referers none blocked www.baidu.com;
			if ($invalid_referer){
				return 403;
			}
			root html/images1;
		}

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

重新配置了一个监听88端口的server

访问http://192.168.92.5:88/images1/fd.png

发现图片不显示了 盗链设置成功

重新建立一个location

server {
        listen 88;
        server_name localhost;

        location /images1 {
            root html;
            valid_referers none blocked www.baidu.com;
            if ($invalid_referer){
                return 403;
            }
        }

这样所有放到images1中的文件都设置了防盗链

在这里插入图片描述

rewrite

2022.5.21

set指令

image-20220521210503524

image-20220521210515156

添加

	server {
		listen 8081;
		server_name localhost;
		location /server{
			set $name TOM;
			set $age 18;
			default_type text/plain;
			return 200 $name=$age;
		}
	}

访问

在这里插入图片描述

添加 args、http_user_agent

server {
	listen 8081;
	server_name localhost;
	location /server{
		set $name TOM;
		set $age 18;
		default_type text/plain;
		return 200 $name=$age=$args;
	}
}

在浏览器输入

http_user_agent 所显示的值与Network下 User-agent 是一致的

添加host:显示的是服务器的server_name值

等等

利用这些可以设定日志的内容

设定日志格式

log_format  '$remote_addr - $request $status $request_uri - $http_user_agent'

在location块下创建日志文件,使用main这个日志格式

查看日志

192.168.92.1 - GET /server?username=wzb&123=qwe HTTP/1.1 - 200 - /server?username=wzb&123=qwe - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.67 Safari/537.36sendfileon

request:返回请求方式、request**: 返回请求方式 、 **request:返回状态码

if指令

添加代码

如果 “username“有值,执行”return 200 $username“

否则返回 200 empty

		location /testif {
			set $username '';
			default_type text/plain;
			if ($username){
				return 200 $username;		
			}
			return 200 'empty';

		}

访问

image-20220521215517386

添加代码

		location /testif {
			set $username '';
			default_type text/plain;
			if ($args){
				return 200 $username;		
			}
			#return 200 'empty';#若不注释,似乎下一个if无法执行
			if ($request_method = POST){
				return 405;
			}
			return 200 error;

		}

不加任何东西访问

$args为空,走下一个if

正常访问网站方法是GET

请求方式为GET

执行 ”return 200 error“

image-20220521221343457

反之 改为GET

		location /testif {
			set $username '';
			default_type text/plain;
			if ($args){
				return 200 $username;		
			}
			#return 200 'empty';
			if ($request_method = GET){
				return 200 'is GET';
			}
			return 200 error;

		}

image-20220521221614659

方法为POST

在cmd输入curl -X POST http://192.168.92.5/testif

image-20220521223455427

正则表达式

~ :区分大小写

~*:不区分大小写

        location /testif {
            set $username '';
            default_type text/plain;
            if ($args){
                return 200 $username;
            }
            #return 200 'empty';
            if ($request_method = POST){
                return 405;
            }
            if ($http_user_agent ~ Safari){
                return 200 Chrome;
            }
            return 200 error;

        }

访问

image-20220522165456869

当用户输入一个错误的网址,返回给用户相应的内容

添加default_type text/html;可识别html语言

		location / {
			root html;
			default_type text/html;
			if (!-f $request_filename){
				return 200 '<h1>file not found</h1>';
			}
		}

在这里插入图片描述

break指令

在这里插入图片描述

添加代码

break使前面的指令生效,后面的无效

add_header username $username;添加头信息来验证

            location /testbreak {
                default_type text/plain;
                set $username TOM;
                if ($args){
                    set $username wzb;
                    break;
                    set $username wzb1;
                }
                add_header username $username;
                return 200 $username;
            }

F12

image-20220522220604843

加了变量之后访问

在这里插入图片描述

因为break终止了当前的匹配,他会在本机中的相应目录下寻找 breaktest目录 和 index.html文件

在nginx中若没有设置root,默认会在 /usr/local/nginx/html中寻找index.html

html下创建 testbreak目录,在其目录下创建index.html

[root@wzb testbreak]# cat index.html 
<h1>it is a mess</h1>

访问

image-20220522222051052

同时 username 改为了 wzb

image-20220522222142117

return指令

在配置文件下添加

        location /testreturn {
            default_type text/plain;
            #return 200 'it is return';
            return https://www.baidu.com;

        }

访问就会跳转到相应的网站

rewrite指令

该指令通过正则表达式的使用来改变URL。可以同时存在一个或者多个指令,按照顺序依次对URL进行匹配和处理。

在配置文件下添加

检测 以 /rewrite...开头 以任意字符结尾的字符串 去向相应的网站

如 访问192.168.92.5/rewrite/url123 即可访问 www.baidu.com

192.168.92.5/rewrite/ti1of360 即可访问www.360.cn

192.168.92.5/rewrite/t2game可访问 www.4399.com

打上括号可以作为变量引用,类似于我之前学的 sed 中的扩展正则

给文件前三行添加@符号 -r 扩展正则表达式 "\1"需要 先将第一个字符替换为#加读取到的第一个字符

[root@wzb my_prac]# sed -r "1,3s/(^.)/@\1/p" 2022-4-21 -n
@#
@1
@#

而在这里是 1,整体上要写作/1,整体上要写作 /1 才可以访问,否则不行

而读取到的参数与设定的location块相匹配的话,就会访问相应的location块的网址

在这里插入图片描述

        location /rewrite {
            access_log  logs/2022.5.28.log;
            default_type text/plain;
            rewrite ^/rewrite/url\w*$ https://www.baidu.com;
            rewrite ^/rewrite/t1of360$ https://www.360.cn;
            rewrite ^/rewrite/t2(game)$ /$1;
            rewrite ^/rewrite/t3(message)$ /$1;
        }
        location /game {
            default_type text/plain;
            return https://www.4399.com;
        }
        location /message {
            default_type text/plain;
            return 200 'it is a message';
        }

添加break

break:将此出重写的URL作为一个新的URL,在本块中继续进行处理

不会将新的URL转向其他的location块

将上面的配置改为rewrite ^/rewrite/t3(message)$ /$1 break;

发现报错404

查看日志发现加了break之后,它在html目录下寻找message文件

与之前的break类似,都是在默认路径下寻找相关文件,但是看起来似乎没什么用?

2022/05/28 21:55:52 [error] 4728#0: *30 open() "/usr/local/nginx/html/message" failed (2: No such file or directory), client: 192.168.92.1, server: wzb, request: "GET /rewrite/t3message HTTP/1.1", host: "192.168.92.5"

添加 redirect

redirect:将重写后的URI返回给客户端,状态码为302,指明是临时重定向RUI,主要用在replacement变量不是以“http://”或者“https://”开头的情况

 rewrite ^/rewrite/t3(message)$ /$1 redirect;

访问后发现地址发生了改变

在这里插入图片描述

添加permanent

permanent:将重写后的URI返回给客户端,状态码为301,指明是永久重定向URI,主要用在replacement变量不是以"http:/""或者"https:/l"开头的情况。

效果与redirect一样

到底是URL还是URI???

rewrite_log指令

开启后,URL重写的相关日志将以notice级别输出到error_log指令配置的日志文件汇总。

添加配置文件

        location /rewrite {
            rewrite_log on;
            error_log logs/error.log notice;
            access_log  logs/2022.5.28.log;
            default_type text/html;
            rewrite ^/rewrite/url\w*$ https://www.baidu.com;
            rewrite ^/rewrite/t1of360$ https://www.360.cn;
            rewrite ^/rewrite/t2(game)$ /$1;
            rewrite ^/rewrite/t3(message)$ /$1 redirect;
        }

就可以在logs/error.log看到rewrite的相关日志

rewrite案例

问题:在群里看到的

AB、C三个公司,A为总公司,B,C为副公司
A的域名为aaa
B的域名为bbb
c的域名为ccc
访问aaa,域名显示aaa,内容显示A的内容
访问bbb,域名显示bbb,内容显示A的内容
访问ccc,域名显示ccc,内容显示A的内容

首先重新建一个server块,用来测试

在hosts下添加三个网址

要求无论访问哪一个,都会跳转到www.wzb.com

127.0.0.1  www.wzb1.com
127.0.0.1  www.wzb2.com
127.0.0.1  www.wzb3.cn

初步的server块

    server {
        listen 80;
        server_name www.wzb1.com;
        location / {
            default_type text/plain;
            return 200 'main page';
        }
    }

在虚拟机的浏览器访问www.wzb1.com即可看到相应内容

再添加一个新的server块

以斜杠开头的都跳转 www.wzb1.com

为什么要 ^/ ???

注意要加上 http://

    server {
        listen 80;
        server_name     www.wzb2.com www.wzb3.cn;
        rewrite         ^/ http://www.wzb1.com;

    }

此时访问 www.wzb2.comwww.wzb3.cn都可以跳转到wzb1

但是若要访问 更深层的就不行了

添加一个新的rewrite

检测到任意字符

    server {
        listen 80;
        server_name     www.wzb2.com www.wzb3.cn;
        #rewrite            ^/ http://www.wzb1.com;
        rewrite     ^(.*) http://www.wzb1.com$1;

添加了之后就可以显示之前打的内容了,但是有什么用呢,输入的也可以是不存在的的文件

那么正则匹配的应该就是 www.wzb3.cn 后面的内容

上面的 ^/ 就是匹配到/ 直接跳转 ....com后面自带一个 / 吗?

image-20220529185211995

域名镜像