web架构4------(nginx常用变量,nginx中英文自动匹配,lnmp网站架构,正向代理,反向代理,负载均衡)
一.前言
本期来介绍nginx最后几个知识点,看着要说的内容很多,其实一点也不多,都是所见即所得的东西。
二.nginx常用变量
2.1 常用变量
$args 请求中的参数,也叫查询参数,如www.123.com/1.php?a=1&b=2的$args就是a=1&b=2,
$content_length HTTP响应信息里的"Content-Length"
$content_type HTTP响应信息里的"Content-Type",文本文件在浏览上是可以直接预览 的,就是可以直接打开
$document_root nginx虚拟主机配置文件中的root站点根目录$document_uri 当前请求中不包含指令的URI,如www.123.com/1.php?a=1&b=2的
$document_uri就是/1.php,不包含后面的参数
$host 主机头,也就是域名或者ip地址
$http_user_agent 客户端的详细信息,也就是浏览器的标识,用curl -A可以指定,比如:curl -A 'jaden/666.0' 192.168.61.139
$http_cookie 客户端的cookie信息
$limit_rate 如果nginx服务器使用limit_rate配置了显示网络速率,则会显示,如果没 有设置, 则显示0
$remote_addr 客户端的公网ip
$remote_port 客户端的port
$remote_user 如果nginx有配置认证,该变量代表客户端认证的用户名
$request_body_file 做反向代理时发给后端服务器的本地资源的名称
$request_method http请求方法,GET/POST/PUT/DELETE等
$request_filename 当前请求的资源文件的路径名称,相当于$document_root/$document_uri的组合
$request_uri 请求的链接,包括$document_uri和$args
$scheme 请求的协议,如ftp,http,https
$server_protocol 客户端请求资源使用的协议的版本,如HTTP/1.0,HTTP/1.1,HTTP/2.0等$server_addr 服务器IP地址
$server_name 服务器的主机名
$server_port 服务器的端口号
$uri 和$document_uri相同
$http_referer 客户端请求时的referer请求头键值对的值,通俗讲就是该请求是通过哪个 链接跳过来的,用curl -e可以指定
2.2 Nginx防盗链
referer的使用场景
百度搜索--点击某个网站--收费
盗链:你自己网站视频下载地址,被别人放到他的网站上了,别人从他网站上点击你的下载链接,下载动作和 流量走的是你的服务器,他收获了人气,你损失了流量。通过referer请求头就可以防盗链。只要下载请求数 据中的referer值不是你自己网站的网址,那就不让下载。
# 修改b网站的index.html文件:
root@web01 web]# cd two/
[root@web01 two]# ls
ceshi games icon index index0 index1 index2 index3 index4 index5 index.html youxi youxi.tar.gz
[root@web01 two]# vim index.html
# 添加如下内容:
<img src='http://a.xxx.com/images/logo.png'>
a网站防盗链
[root@web01 conf.d]# ls
a.xxx.com.conf b.xxx.com.conf c.xxx.com.conf www.xxx.top.conf
[root@web01 conf.d]# vim a.xxx.com.conf
# 加上如下内容
location ~* \.png$ {
if ( $http_referer !~* "a.xxx.com" ) { #!~* 不包含的意思
return 403;
}
}
# 并且将location中的站点根目录放到全局来
server {
listen 80;
server_name a.xxx.com;
access_log /opt/nginx/a.xxx.com_log xxx;
# 站点根目录设置到location外面,表示所有的location的站点根目录都指向/web/one
root /web/one;
index index.html index.htm; location / {
#...
#root /web/one;
#index index.html index.htm;
}
location ~* \.png$ {
if ( $http_referer !~* "a.xxx.com" ) {
return 403;
}
}
}
重点变量:
host #http请求头的host域名
referer #从哪一个url跳转过来的
user_agent #用户的浏览器客户端信息
Connection #是否为长链接
remote_addr #客户端的
ip status #http的状态码
三.nginx 中英文自动匹配
这个示例我们再做一个域名,比如yuyan.com。
# mkdir -p /html/lang/en
# mkdir -p /html/lang/cn
# cd /html/lang/en
# vim index.html # 写点英文
# cd /html/lang/cn # vim index.html # 写点汉字
# hosts文件中加入yuyan.com
server {
listen 80;
server_name yuyan.com;
index index.htm index.html;
charset utf-8;
location / {
if ( $http_accept_language ~* ^en ) { # 如果accept_language的值以en开头,也就是 英文,那么返回英文的站点目录,否则返回中文的站点目录,而且有时候会根据ip地址来返回不同语言的网 站。
root /html/lang/en;
}
root /html/lang/cn;
}
}
chrome浏览器接受的语言的设置,在这里可以添加:
四.lnmp网站架构
网站架构指的是一个网站的搭建环境:操作系统+软件+开发语言这么三个部分组成。而且很多情况下他 们是常用的相对比较固定的组合。软件主要指的是中间件(主要指的是web服务应用程序)+数据库。
数据库:mysql\oracle...数据库管理工具,也叫做数据库管理系统,DBMS:database manager system
linux + nginx + mysql + php lnmp架构
linux + apache + mysql + php lamp架构
windows + apache + mysql + php wamp架构
linux + nginx + mysql + tomcat lnmt架构 ,主要是跑java语言项目的,tomcat本身也是web服务程序,但是本身效率低,可以和nginx结合一起使用
linux + nginx + mysql + uwsgi lnmu架构,主要是跑python语言项目的
我们先捋清楚lnmp架构,其他的也就都简单了。
五.正向代理
客户端使用的代理我们一般称之为正向代理,服务端使用的代理我们一般称之为反向代理。
客户端如果使用了正向代理,那么服务端记录的是代理的ip地址,代理可以有很多层,而且很多网络是 正向代理和反向代理都存在。
我们做一个正向代理试试。
首先找一台服务器,比如我用阿里云的一台服务器作为正向代理服务器吧,安装一个centos7.8,然后安装个nginx
# yum install nginx -y
# 去掉配置用的#号行和空行
[root@web01 conf.d]# grep -Ev '^$|#' /etc/nginx/nginx.conf.default >
/etc/nginx/nginx.conf[root@web01 conf.d]# vim /etc/nginx/nginx.conf
# 修改nginx的配置分别添加http和https的server,其他配置保持不变,我们就添加个http的演示一下即可
# 将nginx.conf配置中的server部分替换为下面的server
# 下面配置正向代理转发http请求
server {
resolver 223.5.5.5;
listen 80;
location / {
proxy_pass http://$host$request_uri;
proxy_set_header HOST $host;
proxy_buffers 256 4k;
proxy_max_temp_file_size 0k;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_next_upstream error timeout invalid_header http_502;
}
} # nginx -t
# systemctl restart nginx
# 这时候的nginx就不代表一个网站了,只是帮我们进行请求的转发,就是单纯的代理。
# 正向代理转发https请求,这个就暂时不说了
通过实时查看nginx的访问日志,可以看到Windows下设置代理IP和端口后,本地电脑访问的所有网页 会通过代理服务器进行访问网页,实现了正向代理的功能,并且隐藏了用户自己真实的IP。
六.反向代理
反向代理更多的时候是为了保护原站,还能用于负载均衡的效果
我们再去克隆一个虚拟机作为反向代理服务器,使用nginx作为反向代理工具,安装nginx,配置如下:
[root@lb01 ~]# cat /etc/nginx/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://192.168.61.140; # 将请求转发到哪个ip地址,原站的ip地址,并 且其实我们正常的话是应该加一个DNS解析记录,将我们的域名指向这个代理服务器的ip地址。我们没有真实 公网主机来演示,所以改一下hosts文件的记录即可,将原来的域名都指向这个代理主机的ip地址。然后访问 网站,wireshark抓包就能看到转发效果。
# 如果只是单纯的配置上面这句话也可以完成反向代理,但是服务端的其他网站就没办法访问 到了,因为nginx转发的时候,会用客户端请求的服务器的ip地址,不会用域名,域名丢了,那么服务端的nginx会自动打开一个网站给你响应。所以还是要设置一下nginx转发时的host请求头,让它变成域名。
proxy_set_header Host $host; # 设置host,以防请求域名丢失。 #proxy_set_header jaden 666666; # 可以自定定制多个转发请求时的请求头键值对
#下面这两个主要是为了记录客户端的真实ip地址,因为有了反向代理之后,我们看到记录的 客户端的ip地址是反向代理服务器的ip地址,这样肯定不行呀,无法定位谁攻击的我,所以我们需要记录用户 的真实ip,所以就可以在nginx转发请求的时候加两个请求头键值对,将客户端真实ip写进去
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr; # 这个简称叫做XFF,业内一 般都用这个字段来记录客户端真实ip地址,也有用上面这个remote_addr来记录的,所以我们都配置上吧, 将nginx的日志记录格式修改一下,加上一个"真实ip:$http_x_forwarded_for"
#proxy_set_header X-Forwarded-For $http_x_forwarded_for;
}
}
}
# 后端服务器日志格式,vim /etc/nginx/nginx.conf,加上如下两条
log_format main '$remote_addr - $remote_user [$time_local] "$request" $http_host ' '
$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/new.log main; # 给所有网站定义日志格式用的
# 保存退出,然后访问网站,就看到日志了。
之前的网站服务器作为原站服务器,然后我们自己的物理机作为客户端访问。
七.负载均衡模式
nginx做反向代理的同时,还可以配置负载均衡,为了演示负载均衡的效果,我们再创建一个web网站服 务器。而且要保证这两台web服务器跑着相同的网站。两个网站简单写一些不太一样的东西,为了是让大家看效果。
修改nginx反向代理的配置:
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream web{
server 192.168.61.140;
server 192.168.61.141;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://web; # 这个地方不写死ip地址了,写个上面配置中的upstream的名称
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $http_x_forwarded_for;
}
}
}
八.总结
总体来说,这些东西现在就算是记住了也会遗忘,所以我们点赞关注加收藏,遇到要用的时候再来看就好了。