DNS 域名解析
- 域名最早通过DNS解析之后,转换IP地址
- 读取本地host文件,host文件中有ip和域名的对应关系
- 在本地host文件中没有找到对应ip和域名关系,就从网络运营商获取对应的IP地址
- 外网访问 -- Nginx -- 反向代理 --- 真实服务器(一般只有内网可以访问)
外网映射工具
- 微信开发、第三方支付。微信事件通知、第三方支付回调通知,如果在本地开发的话,根本就是无法测试。
- 使用第三方外网映射工具,将本地服务映射到外网
- natapp、ngrok
应用场景
- http服务器、静态服务器、图片服务器
- 虚拟主机配置 将一台服务器,拆分多个网站部署
- 反向代理 隐藏真实IP访问地址
- 负载均衡(集群) 减少单台服务器压力、故障转移
- 安全配置
- 搭建API接口网关
- 实现网站动静分离
- 防止DDOS(流量攻击,一直占有宽带)(安全控制)
基于域名区分项目
server {
listen 80;
server_name bbs.z.com;
location / {
root data/bbs;
index index.html;
}
}
server {
listen 80;
##服务name 配置域名,
server_name www.z.com;
#拦截后跳转根目录 资源目录文件 html文件
location / {
root data/www;
index index.html index.htm;
}
}
host文件
127.0.0.1 www.z.com
127.0.0.1 bbs.z.com
查看nginx启动状态
ps aux | grep nginx
启动nginx
nginx
nginx -s reload 重载(配置文件修改后,需要重载) <=> kill -HUP 'cat logs/nginx.pid'
systemctl restart nginx.service
停止nginx
nginx -s quit 当前任务完成后停止
nginx -s stop 立即停止
killall nginx 停止nginx进程
查看哪些端口被占用
netstat -tlnp
根据端口号设置虚拟主机
server {
listen 8080;
server_name localhost;
root /usr/local/nginx/html/html8080;
index index.html
}
查看日志
tail logs/access.log
测试配置文件是否正确
nginx -t
全局配置
worker_processes 1; # 有1个工作的子进程,可以自行修改
Event {
#一般配置nginx连接的特性
worker_connections 1024; # 一个子进程最大允许连1024个连接
}
http { # 配置http服务器的主要段
server { #虚拟主机段
listen 80; #监听的端口号
server_name z.com;
location / { #定位
root /html
index index.html
}
server { #虚拟主机段
location { #定位
}
}
}
root与alias区别
【root】
root 是指定目录的上级目录
配置段:http、server、location、if
默认值: root html
root的处理结果是:root路径 + location路径
【alias】
配置段:location
alias指定的目录是准确的
目录名后面一定要加"/"。
alias的处理结果是:使用alias路径替换location路径
代理
正向代理
正向代理.png
反向代理
反向代理.png
server {
……
location / {
proxy_pass http://XXXX.com
}
}
常用指令
proxy_set_header:在将客户端请求发送给后端服务器之前,更改来自客户端的请求头信息
proxy_connect_timeout:配置Nginx与后端代理服务器尝试建立连接的超时时间。
proxy_redirect:用于修改后端服务器返回的响应头中Location和Refresh。
……
rewrite 重写
使用正则匹配请求的url,然后根据定义的规则进行重写和改变
$http_user_agent 客户端agent信息
$remote_addr 客户端的IP地址
$remote_port 客户端的端口
$server_name 服务器名称
$uri 不带请求参数的原生URI,不包含主机名 如:“/foo/bar.html”
$request_uri 包含请求参数的原生URI,不包含主机名,如:“/foo/bar.php?arg=abc”
……
配置段:server、location
# 重写中用到的指令
if (条件) {} 设定条件, 再进行重写
set #设置变量,可以用来达到多条判断时作标志用
return #返回状态码
break #跳出rewrite
rewrite #重写
location {
if($http_user_agent ~* msie) { #判断是否IE
rewrite ^.*$ /ie.html break;
}
## 不允许谷歌浏览器访问,如果是谷歌浏览器就返回500
if($http_user_agent ~ Chrome) {
return 500;
}
}
条件的写法
1. = 来判断相等,用于字符串比较
2. ~ 用正则来匹配(此处的正则区分大小写)
~* 不区分大小写的正则
3. -f 判断是否为文件
-d 判断是否为目录
-e 判断是否存在
匹配规则
语法规则: location [=|~|~*|^~] /uri/ { … }
= 开头表示精确匹配
^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。
~ 开头表示区分大小写的正则匹配
~* 开头表示不区分大小写的正则匹配
!~和!~*分别为区分大小写不匹配及不区分大小写不匹配 的正则
/ 通用匹配,任何请求都会匹配到。
多个location配置的情况下匹配顺序为(参考资料而来,还未实际验证,试试就知道了,不必拘泥,仅供参考):
首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。
Nginx适配PC或移动设备
server {
listen 8082;
server_name localhost;
location / {
root /usr/local/nginx/pc
if ($http_user_agent ~* 'Android|webOS|iPhone|iPod'){
root /usr/local/nginx/mobile
}
}
}
gzip
# 对文本、javascript、css文件进行压缩输出
http {
gzip: on;
gzip_types text/plain application/javascript text/css;
}
Nginx配置单页应用(vue, react,angular等)路由404问题
location / {
try_files $uri $uri/ /index.html;
}
我们的这种写法try_files $uri $uri/ /index.html;就会导致所有找不到的url都会跳转到index.html文件。
try_files指令
语法:try_files file ... uri 或 try_files file ... = code
默认值:无
作用域:server location
其作用是按顺序检查文件是否存在,返回第一个找到的文件或文件夹(结尾加斜线表示为文件夹),如果所有的文件或文件夹都找不到,会进行一个内部重定向到最后一个参数。
Nginx反向代理post请求变为get请求
把反向代理的Url最后一个 / 去掉就可以了
负载均衡
目的是为了解决高并发,负载均衡器拦截到所有请求,在采用负载均衡算法分配到不同真实的服务上,减去单台服务器的压力。
image.png
服务器集群常用问题
- 分布式Session一致性问题
- 分布式Job幂等性问题
- 分布式生成全局ID
- 分布式锁解决方案
- 分布式配置中心
- 分布式日志收集系统
如何配置负载均衡
- 使用Upstream Server 上游服务器(使用负载均衡器转发到真实业务逻辑访问的服务器)
- Nginx 负载均衡 内置功能:故障转移
# 定义多个上游服务器 默认采用轮训机制
upstream backServer {
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
server {
listen 80;
server_name www.z.com;
location {
# 使用反向代理指向backServer
proxy_pass http://backServer/;
index index.html;
}
}
负载均衡常用算法
- 轮询机制
- 均匀分配访问 服务器配置差不多时
- 权重机制
- 使用weight 配置比例等分 权重越高,访问的次数就会越多
- 应用场景:服务器配置不相同的情况
upstream backServer { server 127.0.0.1:8080 weight=1; server 127.0.0.1:8081 weight=2; }
- IP绑定
- 通过nginx获取ip地址hash运算固定分配到某个服务器上。可以解决session共享问题
upstream backServer { server 127.0.0.1:8080; server 127.0.0.1:8081; ip_hash; }
- 故障转移
upstream backServer {
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
server {
listen 80;
server_name www.z.com;
location {
# 使用反向代理指向backServer
proxy_pass http://backServer/;
# 后端服务器连接超时时间
proxy_connect_timeout 1s;
# 发送给上游服务器超时时间
proxy_send_timeout 1s;
# nginx接收上游服务器超时时间
proxy_read_timeout 1s;
index index.html;
}
}
linux环境安装nginx
# 1.安装gcc gcc-c++(新环境,未安装请先安装)
yum install -y gcc gcc-c++
# 2.安装wget
yum -y install wget
# 3.安装PCRE库 pcre功能是让nginx有rewrite功能
wget http://jaist.dl.sourceforge.net/project/pcre/pcre/8.33/pcre-8.33.tar.gz
tar -zxvf pcre-8.33.tar.gz
cd pcre-8.33
./configure
make && make install
# 4.安装SSL库
cd /usr/local
wget http://www.openssl.org/source/openssl-1.0.1j.tar.gz
tar -zxvf openssl-1.0.1j.tar.gz
cd openssl-1.0.1j
./config
make $$ make install
# 5. 安装zlib库存
cd /usr/local
wget http://zlib.net/zlib-1.2.11.tar.gz
tar -zxvf zlib-1.2.11.tar.gz
cd zlib-1.2.11
./configure
make && make install
# 6. 安装nginx
cd /usr/local/
wget http://nginx.org/download/nginx-1.8.0.tar.gz
tar -zxvf nginx-1.8.0.tar.gz
cd nginx-1.8.0
./configure
make && make install
# 7. 启动
/usr/local/nginx/sbin/nginx
#8. 查看
ps -aux | grep 'nginx'
# 8. 本机测试
curl http://127.0.0.1
# 9. 关闭防火墙
#临时关闭
systemctl stop firewalld
# 禁止开启启动
systemctl disable firewalld
Remove symlink /etc/systemd/system/multi-user.target.wants/firewalld.service
Remove symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service
#