高性能Nginx服务器

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
# 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。