• nginx学习


    一 软件安装

    关闭iptables 和selinux

    iptables -F
    iptables -t nat -F

    setenforce 0

    安装依赖

    yum -y install gcc gcc-c++ autoconf pcre pcre-devel make automake

    安装一些工具

    yum -y install wget httpd-tools vim

     安装nginx

     vim /etc/yum.repos.d//nginx.repo

    填写以下内容

    [nginx]
    name=nginx repo
    baseurl=http://nginx.org/packages/centos/7/$basearch/
    gpgcheck=0
    enabled=1

    执行安装命令

    yum -y install nginx

    启动nginx

    systemctl start nginx.service

    重启nginx

    systemctl restart nginx.service

    nginx 配置文件的语法检查与重新载入nginx配置文件

     二 使用nginx sub_filter(适用上下文是http server location)来进行返回内容替换

    准备一个返回的html内容文件,我这里是111222333,修改/etc/nginx/conf.d/default.conf,将444替换成111,访问该文件

    上面可以看到 只有第一个111串被替换了,后面的111未被替换,关闭once开关,从新载入配置 即可

    三 对访问频率进行限制

    连接限制 limit_conn_module (适用上下文是http )

    请求限制 limit_req_module   (适用上下文是http server location)

      以上两种都可以实现限制,区别在于请求和连接,我们都知道 http请求是基于tcp连接之上的,一次tcp连接下可以进行多次http请求和响应(http1.1版本之后),因此对于请求的限制比对连接的限制的效果要更精确,因为多个请求可以依赖于一个连接,

     

    上面定义了一个请求限制,含义为对于每一个远程地址用户(使用binanry是因为更加省空间),1秒最多请求一次,该zone空间申请的大小是1M

    下面是引用上面的请求限制 其中burst 代表后面延长请求的数量 其他则不延迟  ,nodelay是不延迟

    使用ab压测,从结果可以看到 有  49个错误请求,从错误请求日志也能看出来,大量的请求被req_zone限制了

    四 nginx 访问控制

      语法 allow或者deny  address| CIDR | unix all ;

      context http,server location 

      

      

      这里设置的是对于以admin.html为结尾的访问请求(注意,allow和deny是成对配置的),只允许112.10.109.110 ip的用户访问,其他用户禁止(返回403)。

      上面的访问控制是有一定的局限性的,因为这种现在只能控制直接的client对服务器的访问限制,如果别人使用代理访问,比如使用nginx代理访问那么我们nginx获取的remote_addr是代理服务器的ip,而不是真正访问者的ip,因此 对于这种情况  这种限制是无济于事的。

      解决这种问题的方法之一是使用 x_forward_for, x_forward_for是http协议规定 应该要携带的信息 ,x_forward_for = clientIP,Proxy1Ip,ProxyIp ...,对于以下访问链

      client(ip1)  --> Proxy(ip2) --> nginx(我们的服务)ip3

      对于 Proxy看到的remote_addr是ip1,x_forward_for 也是ip1,

      对于我们的nginx看到的remote_addr是ip2,x_forward_for 则是ip1,ip2 

      当然x_forward_for,仅仅是http协议所要求的 但是不一定所有的代理厂商会按照这个要求来做 就算按照这个要求来做,x_forward_for 头信息也可能会被修改,所以x_forward_for 也仅仅是一个参考。

      第二种方法是使用geo

      第三种是使用http 自定义变量传递

      nginx权限控制

        安装相关依赖, yum install httpd-tools -y

     以test为用户名生成密码配置文件,生成相关密码配置文件 htpasswd -c ./auth.conf test  两次输入密码即可。

    再次访问将会弹出输入密码对话框

    这种方式比较机械,需要配置对应的密码文件,如果有多套密码 还需要单独的去管理他们,管理低效

     另外实现方式是nginx+lua

    五  nginx处理静态资源

       使用gzip进行文件压缩,参考 http://www.cnblogs.com/mitang/p/4477220.html

    六 浏览器缓存机制

      1 校验是否过期 Expires (http1.0版本),Catche-Control(根据max-age来校验 适用于 http1.1版本) 

      2 如果第一步过期,那么根据Etag(携带一串特殊的字符串)来进行校验,Last-Modified来校验Last-Modified会传送文件最后的修改日期。

      3 如果第二部匹配一致返回不过期,那么说明服务端无最新更新 ,服务器返回304代码,如果不匹配 并且无其他错误 那么返回最新数据 并且服务器返回200

    默认情况下 ,在我们第一次访问服务器的某个资源时 服务器会返回200,再次访问 服务器会返回304 Not Modified,在请求信息里 浏览器会为我们设定 max-age=0

    这意味着每次请求 服务器都要去校验服务器资源是否过期

    我们加上 服务器缓存设置,并且再次访问这个文件,这时服务器响应体会携带服务器设定的max-age,这意味着服务器告诉客户端我已经设置好了,你应该按照我这个规则来 只是说客户端不一定会去遵循这个规则。好处是能实时与服务端交互 坏处是没利用缓存。

     七 nginx跨域访问

       一般来说 浏览器会禁止跨站访问,因为容易出现CSRF跨站攻击,但是处于一切其他原因 往往需要打开这个跨站访问设置。 

      比如一个A网站页面去访问B网站地址,那么浏览器会跨域访问错误,加一下配置 那么会允许访问所有其他服务器,* 也可以换成特定服务器

    http {
      ###start####
      add_header Access-Control-Allow-Origin *;
      add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
      ###end ###
    }

    八 nginx 代理服务

      正向代理:代理的对象是客户端 ,比如翻  墙,

      反向代理:代理的是服务端 ,客户端请求代理服务器 代理服务器去真正的服务器获取内容然后返回给客户端。

      下面实现反向代理  这个配置监听80端口,当请求的是test_proxy.html的时候 转到本机的8080端口访问,8080端口配置 就是普通配置了。这时候 请求请求80端口对应的test_proxy.html 能访问到结果,但是关闭红框配置 就找不到资源了

    ngixn 代理配置还有许多其他配置,这里不再介绍,后面用到了再去查吧。

    九 nginx 负载均衡服务

      

      这里是上面配置一个upstream,定义的是三个节点 权重分别是20 10 1 ,下面是将80的请求反向代理到test节点上。  这是我们可以访问80端口的请求,会转到以上三个节点上。

      upstream 还有其他配置  如 $request_uri ,ip_hash backup  down max_conns 等等。

    十 nginx做缓存服务

      缓存分 服务端缓存 中间件/代理(浏览器缓存) 客户端缓存,  具体参考 https://www.cnblogs.com/kevingrace/p/6198287.html  

    十一 nginx动静分离

      参考 https://www.jianshu.com/p/fd18af018467

    十二 nginx rewrite重写规则

      last  停止rewrite检测

      break  停止rewrite检测

      redirect  返回302临时重定向 地址栏会显示跳转后的地址

      permanent  返回301永久重定向(客户端收到对应的请求以后,除非手动清理缓存 否则将一重定向新地址 即使你关闭服务器nginx服务) 地址栏会显示跳转后的地址

      last  与break的区别是当请求路径不存在时,last会重新发送请求 到新的路径,而break不会

    十三 nginx GEO功能

      下载geo模块  yum install -y nginx-module-geoip(下载前先配置好yum源 上面可以参考)

      wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz

      wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz

      解压

      gunzip GeoIP.dat.gz GeoLiteCity.dat.gz

      现在nginx主配置文件加载模块

    下面配置实现了 如果ip地址不是中国的地址 那么禁止访问(注意书写格式比如 if后面加空格, 不然容易出现呢问题)

    这时如果我们使用科学上网,那么将返回403,正常访问可以访问

     十四 配置HTTPS

      https加密原理  https://blog.csdn.net/clh604/article/details/22179907

      生成ssl证书 openssl genrsa -idea -out jeaonc.key 1024

        生成csr证书签名请求文件 openssl req -new -key jesonc.key -out jesonc.csr

      生成 crt文件 openssl x509 -req -days 3650 -in jesonc.csr -signkey jesonc.key -out jssonc.crt

      这里设置过期时间10年,

      也可以不按照上面的步骤来做,下面 根据key直接生成crt 文件

      openssl req -days 36500 -x509 -sha256 -nodes -newkey rsa:2048 -keyout jesonc.key -out jesonc_apple.crt

      设置监听配置 

    访问

    https 服务的优化

      https是会消耗服务器资源的,因此适当的优化是有必要的,1 激活长链接,2 设置session缓存 

      

    十五 nginx 与lua

      lua 是一个简洁 轻量基于c语言的脚本语言

      安装lua  yum install lua ,

      交互式使用lua

    使用脚本执行lua,新建test.lua 然后直接执行这个脚本

    lua 的行注释 --我是注释 ,块注释--[[我是注释]]-- 

    lua中数字类型只有一个double,布尔类型有nil和false。 数字0 ,""," "都表示true,另外 如果没有特殊说明 lua变量都是全局变量,除非加了loacl关键字。

    安装LuaJIT

    cd /data

    wget http://luajit.org/download/LuaJIT-2.0.2.tar.gz

    tar -xzvf LuaJIT-2.0.2.tar.gz

    cd LuaJIT-2.0.2

    make install PREFIX=/usr/local/LuaJIT

    export LUAJIT_LIB=/usr/local/LuaJIT/lib

    export LUAJIT_INC=/usr/local/LuaJIT/include/luajit-2.0

    cd /data

    wget https://github.com/simpl/ngx_devel_kit/archive/v0.3.0.tar.gz

    wget https://github.com/openresty/lua-nginx-module/archive/v0.10.9rc7.tar.gz

    输入nginx -V ,从--prefix取起,加上上面两个模块 ,以./configure

    ./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie' --add-module=/data/ngx_devel_kit-0.3.0 --add-module=/data/lua-nginx-module-0.10.9rc7

     make -j 4 && make install 

    nginx的location优先级: https://blog.csdn.net/xy2204/article/details/47749405

    nginx的 try_files: http://blog.51cto.com/10546390/1754757

    nginx  alias和root的区别: https://www.cnblogs.com/yanghj010/p/5772652.html

    nginx 502的问题,一般是后端服务(php,java)无响应的问题

    nginx 504的问题。一般是后端服务执行时间超时,默认是60秒

  • 相关阅读:
    python的gui库tkinter
    python图像处理库Pillow基本使用方法
    github配置SSH proxy
    python的pandas库读取csv
    学习app开发思路
    shell脚本中四则运算
    shell脚本实例三
    shell脚本实例二
    shell脚本实例一
    LINUX系统下的shell命令---grep、sed、awk
  • 原文地址:https://www.cnblogs.com/tjqBlog/p/10153113.html
Copyright © 2020-2023  润新知