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 --with 后make 在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.log以myformat的形式输出 保存,重启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.5和http://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/abcd 而 http://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 页面
Nginx 静态资源优化
sendfile
在 html下创建 welcome.html
[root@wzb html]# ls
50x.html images1 index.html welcome.html
在浏览器访问
显示访问成功
这就是 访问静态资源的整个过程
tcp_nopush,tcp_nodelay
在 http块下添加
静态资源压缩
gzip
在 配置文件下的 http块下添加gzip on;
在浏览器访问 http://192.168.92.5/ceshi.txt
F12 打开控制器,选中 network
发现文件大小还是3.5KB
pass
在Headers中查看
发现类型是 “text/plain”
在 配置文件中添加
gzip_types text/plain;
运行之后,再次刷新,发现大小从3.5k变成了1.6k
pass
关闭浏览器的缓存功能:在network下 将Disable cache 打勾
gzip_comp_level
pass
gzip_vary
pass
gzip_buffers
gzip_disable
pass
在 控制台 的Headers 的最后可以看到 User-Agent
在 配置文件 添加 正则
gzip_disable "Mozilla/5.0.*";
若匹配到则不适用gzip
刷新页面可以发现文件没有没压缩
gzip_http_version
pass
gzip_min_length
允许压缩的最小值
在控制台的 Header可看到 Content_length 是文件的大小
设定的比Content=Length大 文件就不会被压缩
gzip_proxied
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
在 http 块下 添加 gzip_static on;
该命令可以找到和要找的资源同名的以.gz结尾的文件
在html目录下 gzip for1.txt
可以解决sendfile 和 gzip共存的问题
之后将 include nginx_gzp.conf注释
访问
执行gzip for1.txt
发现被压缩
浏览器缓存相关指令
强缓存和弱缓存
浏览器清除数据,访问,发现状态码是200 ,大小为原大小,是从服务器获取的文件
重新刷新页面,状态码为304,弱缓存,是检验了文件,是通过if-Modified-Since和If-None-Match来判断是否发生了修改
并且在 中会多出几行信息
打开一个新页面,打开控制台输入地址
发现 200 ,但是是灰色,且没有具体的大小,说明是直接从本地读取的文件,是强缓存
expires
该指令用来控制页面缓存的作用
可以通过该指令控制HTTP应答中的"Expires"和"Cache-Cdntrol"
在配置文件
任意以.html、js、css、jpg、txt结尾的文件,
1000 表示1000秒
10d 表示10天
location ~ .*.(html|js|css|jpg|txt)$ {
expires 1000;
}
运行后在控制台发现多了几行数据
若 expires为负数,那么就会到服务端校验文件是否发生变化,走弱缓存
add_header
add_header指令是用来添加指定的响应头和响应值
在配置文件添加,尝试不缓存, 从服务器读取文件
location ~ .*.(html|js|css|jpg|txt)$ {
expires 1000;
add_header Cache-Control no-store;
}
多次刷新后,发现都是从服务器获取数据
nginx跨域问题
在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也成功
静态资源防盗链
在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指令
添加
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:返回状态码
if指令
添加代码
如果 “username“有值,执行”return 200 $username“
否则返回 200 empty
location /testif {
set $username '';
default_type text/plain;
if ($username){
return 200 $username;
}
return 200 'empty';
}
访问
添加代码
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“
反之 改为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;
}
方法为POST
在cmd输入curl -X POST http://192.168.92.5/testif
正则表达式
~ :区分大小写
~*:不区分大小写
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;
}
访问
当用户输入一个错误的网址,返回给用户相应的内容
添加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
加了变量之后访问
因为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>
访问
同时 username 改为了 wzb
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 才可以访问,否则不行
而读取到的参数与设定的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案例
问题:在群里看到的
有A、B、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.com和www.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后面自带一个 / 吗?