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 ,""," \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秒
posted on 2018-12-25 15:46 Advance_Man 阅读(284) 评论(0) 编辑 收藏 举报