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秒

原文地址:https://www.cnblogs.com/tjqBlog/p/10153113.html