Nginx全解析

Nginx全解析

什么是nginx

Nginx(“engine x”)是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。

在高连接并发的情况下,Nginx是Apache服务器不错的替代品。

什么是反向代理

反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率。

简单的说就是用户请求反向代理服务器,反向代理服务器做请求分发,决定用户访问哪个服务器ip

安装Nginx与运行

  1. 官网http://nginx.org/下载对应的nginx包,推荐使用稳定版本

  2. 上传nginx到linux系统

  3. 安装依赖环境

    (1)安装gcc环境

      yum install gcc-c++
    

    (2)安装PCRE库,用于解析正则表达式

     yum install -y pcre pcre-devel
    

    (3)zlib压缩和解压缩依赖,

     yum install -y zlib zlib-devel
    

    (4)SSL 安全的加密的套接字协议层,用于HTTP安全传输,也就是https

     yum install -y openssl openssl-devel
    
  4. 解压,需要注意,解压后得到的是源码,源码需要编译后才能安装

    tar -zxvf nginx-1.16.1.tar.gz
    
  5. 编译之前,先创建nginx临时目录,如果不创建,在启动nginx的过程中会报错

    mkdir /var/temp/nginx -p
    
  6. 在nginx目录,输入如下命令进行配置,目的是为了创建makefile文件

    ./configure \n    --prefix=/usr/local/nginx \n    --pid-path=/var/run/nginx/nginx.pid \n    --lock-path=/var/lock/nginx.lock \n    --error-log-path=/var/log/nginx/error.log \n    --http-log-path=/var/log/nginx/access.log \n    --with-http_gzip_static_module \n    --http-client-body-temp-path=/var/temp/nginx/client \n    --http-proxy-temp-path=/var/temp/nginx/proxy \n    --http-fastcgi-temp-path=/var/temp/nginx/fastcgi \n    --http-uwsgi-temp-path=/var/temp/nginx/uwsgi \n    --http-scgi-temp-path=/var/temp/nginx/scgi
    
    • 注: 代表在命令行中换行,用于提高可读性

    • 配置命令:

      命令解释
      –prefix指定nginx安装目录
      –pid-path指向nginx的pid
      –lock-path锁定安装文件,防止被恶意篡改或误操作
      –error-log错误日志
      –http-log-pathhttp日志
      –with-http_gzip_static_module启用gzip模块,在线实时压缩输出数据流
      –http-client-body-temp-path设定客户端请求的临时目录
      –http-proxy-temp-path设定http代理临时目录
      –http-fastcgi-temp-path设定fastcgi临时目录
      –http-uwsgi-temp-path设定uwsgi临时目录
      –http-scgi-temp-path设定scgi临时目录
  7. make编译

    make
    
  8. 安装

    make install
    
  9. 进入sbin目录启动nginx

    ./nginx
    
    • 停止:./nginx -s stop
    • 重新加载:./nginx -s reload
  10. 打开浏览器,访问虚拟机所处内网ip即可打开nginx默认页面,显示正常便表示安装成功。

注意事项:
  1. 如果在云服务器安装,需要开启默认的nginx端口:80
  2. 如果在虚拟机安装,需要关闭防火墙
  3. 本地win或mac需要关闭防火墙

nginx.conf 核心配置文件

  1. 设置worker进程的用户,指的linux中的用户,会涉及到nginx操作目录或文件的一些权限,默认为nobody

    user root;
    
  2. worker进程工作数设置,一般来说CPU有几个,就设置几个,或者设置为N-1也行

    worker_processes 1;
    
  3. nginx 日志级别debug | info | notice | warn | error | crit | alert | emerg,错误级别从左到右越来越大

  4. 设置nginx进程 pid

    pid        logs/nginx.pid;
    
  5. 设置工作模式

    events {
        # 默认使用epoll
        use epoll;
        # 每个worker允许连接的客户端最大连接数
        worker_connections  10240;
    }
    
  6. http 是指令块,针对http网络传输的一些指令配置

    http {
    }
    
  7. include 引入外部配置,提高可读性,避免单个配置文件过大

    include       mime.types;
    
  8. 设定日志格式,main为定义的格式名称,如此 access_log 就可以直接使用这个变量了
    图片描述

    参数名参数意义
    $remote_addr客户端ip
    $remote_user远程客户端用户名,一般为:’-’
    $time_local时间和时区
    $request请求的url以及method
    $status响应状态码
    $body_bytes_send响应客户端内容字节数
    $http_referer记录用户从哪个链接跳转过来的
    $http_user_agent用户所使用的代理,一般来时都是浏览器
    $http_x_forwarded_for通过代理服务器来记录客户端的ip
  9. sendfile使用高效文件传输,提升传输性能。启用后才能使用tcp_nopush,是指当数据表累积一定大小后才发送,提高了效率。

    sendfile        on;
    tcp_nopush      on;
    
  10. keepalive_timeout设置客户端与服务端请求的超时时间,保证客户端多次请求的时候不会重复建立新的连接,节约资源损耗。

#keepalive_timeout  0;
keepalive_timeout  65;
  1. gzip启用压缩,html/js/css压缩后传输会更快

    gzip on;
    
  2. server可以在http指令块中设置多个虚拟主机

    • listen 监听端口
    • server_name localhost、ip、域名
    • location 请求路由映射,匹配拦截
    • root 请求位置
    • index 首页设置
        server {
                listen       88;
                server_name  localhost;
        
                location / {
                    root   html;
                    index  index.html index.htm;
                }
        }
    

location 的匹配规则

  • 空格:默认匹配,普通匹配

    location / {
         root /home;
    }
    
  • =:精确匹配

    location = /gy/img/face1.png {
        root /home;
    }
    
  • ~*:匹配正则表达式,不区分大小写

    #符合图片的显示
    location ~* .(GIF|jpg|png|jpeg) {
        root /home;
    }
    
  • ~:匹配正则表达式,区分大小写

    #GIF必须大写才能匹配到
    location ~ .(GIF|jpg|png|jpeg) {
        root /home;
    }
    
  • ^~:以某个字符路径开头

    location ^~ /gy/img {
        root /home;
    }
    

root 与 alias

假如服务器路径为:/home/gy/files/img/face.png

  • root 路径完全匹配访问
    配置的时候为:

    location /gy {
        root /home
    }
    

用户访问的时候请求为:url:port/gy/files/img/face.png

  • alias 可以为你的路径做一个别名,对用户透明
    配置的时候为:

    location /hello {
        alias /home/gy
    }
    

    用户访问的时候请求为:url:port/hello/files/img/face.png,如此相当于为目录gy做一个自定义的别名。

Nginx 日志切割-手动

现有的日志都会存在 access.log 文件中,但是随着时间的推移,这个文件的内容会越来越多,体积会越来越大,不便于运维人员查看,所以我们可以通过把这个大的日志文件切割为多份不同的小文件作为日志,切割规则可以以为单位,如果每天有几百G或者几个T的日志的话,则可以按需以每半天或者每小时对日志切割一下。

具体步骤如下:

  1. 创建一个shell可执行文件:cut_my_log.sh,内容为:

    #!/bin/bash
    LOG_PATH="/var/log/nginx/"
    RECORD_TIME=$(date -d "yesterday" +%Y-%m-%d+%H:%M)
    PID=/var/run/nginx/nginx.pid
    mv ${LOG_PATH}/access.log ${LOG_PATH}/access.${RECORD_TIME}.log
    mv ${LOG_PATH}/error.log ${LOG_PATH}/error.${RECORD_TIME}.log
    
    #向Nginx主进程发送信号,用于重新打开日志文件
    kill -USR1 `cat $PID`
    
  2. cut_my_log.sh添加可执行的权限:

    chmod +x cut_my_log.sh
    
  3. 测试日志切割后的结果:

    ./cut_my_log.sh
    

Nginx 日志切割-定时

使用定时任务

  1. 安装定时任务:

    yum install crontabs
    
  2. crontab -e 编辑并且添加一行新的任务:

    */1 * * * * /usr/local/nginx/sbin/cut_my_log.sh
    
  3. 重启定时任务:

    service crond restart
    
  • 附:常用定时任务命令:

    service crond start         //启动服务
    service crond stop          //关闭服务
    service crond restart       //重启服务
    service crond reload        //重新载入配置
    crontab -e                  // 编辑任务
    crontab -l                  // 查看任务列表
    

定时任务表达式:

Cron表达式是,分为5或6个域,每个域代表一个含义,如下所示:

星期几年(可选)
取值范围0-590-231-311-121-72019/2020/2021/…

常用表达式:

  • 每分钟执行:

    */1 * * * *
    
  • 每日凌晨(每天晚上23:59)执行:

    59 23 * * *
    
  • 每日凌晨1点执行:

    0 1 * * *
    

Nginx 跨域配置支持

#允许跨域请求的域,*代表所有
add_header 'Access-Control-Allow-Origin' *;
#允许带上cookie请求
add_header 'Access-Control-Allow-Credentials' 'true';
#允许请求的方法,比如 GET/POST/PUT/DELETE
add_header 'Access-Control-Allow-Methods' *;
#允许请求的header
add_header 'Access-Control-Allow-Headers' *;

Nginx 防盗链配置支持

#对源站点验证
valid_referers *.gy.com; 
#非法引入会进入下方判断
if ($invalid_referer) {
    return 404;
} 

upstream 指令参数 max_conns

限制每台server的连接数,用于保护避免过载,可起到限流作用。
测试参考配置如下:

# worker进程设置1个,便于测试观察成功的连接数
worker_processes  1;

upstream tomcats {
        server 192.168.1.173:8080 max_conns=2;
        server 192.168.1.174:8080 max_conns=2;
        server 192.168.1.175:8080 max_conns=2;
}

upstream 指令参数 down、backup

down 用于标记服务节点不可用:

upstream tomcats {
        server 192.168.1.173:8080 down;
#       server 192.168.1.190:8080;
        server 192.168.1.174:8080 weight=1;
        server 192.168.1.175:8080 weight=1;
}

backup表示当前服务器节点是备用机,只有在其他的服务器都宕机以后,自己才会加入到集群中,被用户访问到:

upstream tomcats {
        server 192.168.1.173:8080 backup;
#       server 192.168.1.190:8080;
        server 192.168.1.174:8080 weight=1;
        server 192.168.1.175:8080 weight=1;
}
注意
  • backup参数不能使用在hashrandom load balancing中。

upstream 指令参数 max_fails、fail_timeout

max_fails:表示失败几次,则标记server已宕机,剔出上游服务。
fail_timeout:表示失败的重试时间。
假设目前设置如下:

max_fails=2 fail_timeout=15s 

则代表在15秒内请求某一server失败达到2次后,则认为该server已经挂了或者宕机了,随后再过15秒,这15秒内不会有新的请求到达刚刚挂掉的节点上,而是会请求到正常运作的server,15秒后会再有新请求尝试连接挂掉的server,如果还是失败,重复上一过程,直到恢复。

Keepalived 提高吞吐量

keepalived: 设置长连接处理的数量
proxy_http_version:设置长连接http版本为1.1
proxy_set_header:清除connection header 信息

upstream tomcats {
#       server 192.168.1.173:8080 max_fails=2 fail_timeout=1s;
        server 192.168.1.190:8080;
#       server 192.168.1.174:8080 weight=1;
#       server 192.168.1.175:8080 weight=1;
        keepalive 32;
}

server {
        listen       80;
        server_name  www.tomcats.com;

        location / {
            proxy_pass  http://tomcats;
            proxy_http_version 1.1;
            proxy_set_header Connection "";
        }
    }

负载均衡 ip_hash

ip_hash 可以保证用户访问可以请求到上游服务中的固定的服务器,前提是用户ip没有发生更改。
使用ip_hash的注意点:
不能把后台服务器直接移除,只能标记down.

If one of the servers needs to be temporarily removed, it should be marked with the down parameter in order to preserve the current hashing of client IP addresses.

upstream tomcats {
        ip_hash;

        server 192.168.1.173:8080;
        server 192.168.1.174:8080 down;
        server 192.168.1.175:8080;
}

负载均衡 url_hash 与 least_conn

根据每次请求的url地址,hash后访问到固定的服务器节点。

upstream tomcats {
    # url hash
    hash $request_uri;
    # 最少连接数
    # least_conn

    server 192.168.1.173:8080;
    server 192.168.1.174:8080;
    server 192.168.1.175:8080;
}


server {
    listen 80;
    server_name www.tomcats.com;

    location / {
        proxy_pass  http://tomcats;
    }
}

Nginx的缓存

  1. 浏览器缓存:
    • 加速用户访问,提升单个用户(浏览器访问者)体验,缓存在本地
  2. Nginx缓存
    • 缓存在nginx端,提升所有访问到nginx这一端的用户
    • 提升访问上游(upstream)服务器的速度
    • 用户访问仍然会产生请求流量
  • 控制浏览器缓存:

    location /files {
        alias /home/imooc;
        # expires 10s;
        # expires @22h30m;
        # expires -1h;
        # expires epoch;
        # expires off;
        expires max;
    }
    

Nginx的反向代理缓存

# proxy_cache_path 设置缓存目录
#       keys_zone 设置共享内存以及占用空间大小
#       max_size 设置缓存大小
#       inactive 超过此时间则被清理
#       use_temp_path 临时目录,使用后会影响nginx性能
proxy_cache_path /usr/local/nginx/upstream_cache keys_zone=mycache:5m max_size=1g inactive=1m use_temp_path=off;
location / {
    proxy_pass  http://tomcats;

    # 启用缓存,和keys_zone一致
    proxy_cache mycache;
    # 针对200和304状态码缓存时间为8小时
    proxy_cache_valid   200 304 8h;
}

使用Nginx配置HTTPS域名证书

1. 安装SSL模块

要在nginx中配置https,就必须安装ssl模块,也就是: http_ssl_module

  • 进入到nginx的解压目录: /home/software/nginx-1.16.1

  • 新增ssl模块(原来的那些模块需要保留)

    ./configure \
    --prefix=/usr/local/nginx \
    --pid-path=/var/run/nginx/nginx.pid \
    --lock-path=/var/lock/nginx.lock \
    --error-log-path=/var/log/nginx/error.log \
    --http-log-path=/var/log/nginx/access.log \
    --with-http_gzip_static_module \
    --http-client-body-temp-path=/var/temp/nginx/client \
    --http-proxy-temp-path=/var/temp/nginx/proxy \
    --http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
    --http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
    --http-scgi-temp-path=/var/temp/nginx/scgi  \
    --with-http_ssl_module
    
  • 编译和安装

    make
    
    make install
    
2. 配置HTTPS
  • 把ssl证书 *.crt 和 私钥 *.key 拷贝到/usr/local/nginx/conf目录中。

  • 新增 server 监听 443 端口:

    server {
        listen       443;
        server_name  www.skyy.com;
    
        # 开启ssl
        ssl     on;
        # 配置ssl证书
        ssl_certificate      skyy.com.crt;
        # 配置证书秘钥
        ssl_certificate_key  skyy.com.key;
    
        # ssl会话cache
        ssl_session_cache    shared:SSL:1m;
        # ssl会话超时时间
        ssl_session_timeout  5m;
    
        # 配置加密套件,写法遵循 openssl 标准
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
        ssl_prefer_server_ciphers on;
        
        location / {
            proxy_pass http://tomcats/;
            index  index.html index.htm;
        }
     }
    
3. reload nginx
./nginx -s reload
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值