nginx实用文章
Nginx 五大常见应用场景
一、自定义返回客户端的404错误页面
1)优化前,客户端使用浏览器访问不存在的页面,会提示404文件未找到
# firefox http://192.168.4.5/xxxxx //访问一个不存在的页面
2)修改 Nginx 配置文件,自定义报错页面
# vim /usr/local/nginx/conf/nginx.conf .. .. charset utf-8; //仅在需要中文时修改该选项 error_page 404 /404.html; //自定义错误页面 .. .. # vim /usr/local/nginx/html/404.html //生成错误页面 Oops,No NO no page … # nginx -s reload # 请先确保 nginx 是启动状态,否则运行该命令会报错,报错信息如下: #[error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)
3)优化后,客户端使用浏览器访问不存在的页面,会提示自己定义的 40x.html 页面
# firefox http://192.168.4.5/xxxxx //访问一个不存在的页面
二、优化 Nginx 并发量
1)优化前使用ab高并发测试
# ab -n 2000 -c 2000 http://192.168.4.5/ Benchmarking 192.168.4.5 (be patient) socket: Too many open files (24) //提示打开文件数量过多
2)修改 Nginx 配置文件,增加并发量
# vim /usr/local/nginx/conf/nginx.conf .. .. worker_processes 2; //与CPU核心数量一致 events { worker_connections 65535; //每个worker最大并发连接数 } .. .. # /usr/local/nginx/sbin/nginx -s reload
3)优化 Linux 内核参数(最大文件数量)
# ulimit -a //查看所有属性值 # ulimit -Hn 100000 //设置硬限制(临时规则) # ulimit -Sn 100000 //设置软限制(临时规则) # vim /etc/security/limits.conf .. .. * soft nofile 100000 * hard nofile 100000 #该配置文件分4列,分别如下:10.#用户或组 硬限制或软限制 需要限制的项目 限制的值
4)优化后测试服务器并发量(因为客户端没调内核参数,所以在proxy测试)
# ab -n 2000 -c 2000 http://192.168.4.5/
三、优化 Nginx 数据包头缓存
1)优化前,使用脚本测试长头部请求是否能获得响应
# cat lnmp_soft/buffer.sh #!/bin/bash URL=http://192.168.4.5/index.html? for i in {1..5000} do URL=${URL}v$i=$i done curl $URL //经过5000次循环后,生成一个长的URL地址栏 # ./buffer.sh .. .. <center><h1>414 Request-URI Too Large</h1></center> //提示头部信息过大
2)修改 Nginx 配置文件,增加数据包头部缓存大小
vim /usr/local/nginx/conf/nginx.conf ... .. http { client_header_buffer_size 1k; //默认请求包头信息的缓存 large_client_header_buffers 4 4k; //大请求包头部信息的缓存个数与容量 .. .. } # /usr/local/nginx/sbin/nginx -s reload
3)优化后,使用脚本测试长头部请求是否能获得响应
# cat buffer.sh #!/bin/bash URL=http://192.168.4.5/index.html? for i in {1..5000} do URL=${URL}v$i=$i done curl $URL # ./buffer.sh
四、浏览器本地缓存静态数据
1)使用Firefox浏览器查看缓存
以Firefox浏览器为例,在Firefox地址栏内输入about:cache将显示Firefox浏览器的缓存信息,如图所示,点击List Cache Entries可以查看详细信息。
2)清空firefox本地缓存数据
3)改Nginx配置文件,定义对静态页面的缓存时间
# vim /usr/local/nginx/conf/nginx.conf server { listen 80; server_name localhost; location / { root html; index index.html index.htm; } location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ { expires 30d; //定义客户端缓存时间为30天 } } # cp /usr/share/backgrounds/day.jpg /usr/local/nginx/html # /usr/local/nginx/sbin/nginx -s reload #请先确保nginx是启动状态,否则运行该命令会报错,报错信息如下:16.#[error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)
4)优化后,使用Firefox浏览器访问图片,再次查看缓存信息
# firefox http://192.168.4.5/day.jpg
在 firefox 地址栏内输入 about:cache,查看本地缓存数据,查看是否有图片以及过期时间是否正确。
五、Nginx之缓存代理模块的使用
Nginx的proxy_cache模块配置一个缓存服务器,带来的优缺点,可以根据不同的场景适当选择:
- 当上游
upstream
端的服务器的响应内容发生了变化的时候,缓存服务器响应的内容在失效时间之前是不会变化
的,因此要确认是否适用当前的场景 - 配置缓存代理服务器,可以
提高网站的访问性能
配置实践
在http
段配置缓存的相关参数,如缓存的存储位置、缓存级别、缓存空间、缓存存储最大多少,缓存有效时常
# http proxy_cache_path /tmp/nginxcache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
配置缓存服务器
upstream local { server 127.0.0.1:8089; } server { server_name proxy.devopsman.cn; listen 80; location / { proxy_set_header Host $host; proxy_set_header X-Real_IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;; proxy_cache my_cache; proxy_cache_key $host$uri$is_args$args; proxy_cache_valid 200 304 302 1d; proxy_pass http://local; } }
然后重载nginx之后,nginx就会自动的生成对应缓存目录
nginx -s reload root@master:/tmp# ls -alh |grep nginx drwx------ 9 www root 4.0K Jul 12 06:07 nginxcache root@master:/tmp# tree ./nginxcache/ ./nginxcache/ ├── 0 │ └── 7d ├── 1 │ └── 54 ├── 4 │ ├── 38 │ └── 92 ├── 6 │ └── 27 ├── a │ └── 39 ├── b │ └── 2b └── f └── c4 15 directories, 0 files
当我们对proxy.devopsman.cn
发起新的资源请求,资源就会被缓存在该目录下。当我们把127.0.0.1:8089
服务给停掉之后,访问之前访问过的资源依旧可以正常的获取,因为影响的数据是从缓存中直接返回的。
六、nginxWebUI图形化管理nginx
1、项目地址
https://gitee.com/cym1102/nginxWebUI
https://nginxconfig.io/ 国外版
docker pull registry.cn-hangzhou.aliyuncs.com/cym1102/nginxwebui
docker run -itd -v /home/nginxWebUI:/home/nginxWebUI -e BOOT_OPTIONS="--server.port=8080" --privileged=true --net=host cym1102/nginxwebui:latest /bin/bash
注意:
-
启动容器时请使用--net=host参数, 直接映射本机端口, 因为内部nginx可能使用任意一个端口, 所以必须映射本机所有端口.
-
容器需要映射路径/home/nginxWebUI:/home/nginxWebUI, 此路径下存放项目所有数据文件, 包括数据库, nginx配置文件, 日志, 证书等, 升级镜像时, 此目录可保证项目数据不丢失. 请注意备份.
-
-e BOOT_OPTIONS 参数可填充java启动参数, 可以靠此项参数修改端口号
--server.port 占用端口, 不填默认以8080端口启动
- 日志默认存放在/home/nginxWebUI/log/nginxWebUI.log
七、nginx跨域
什么情况下会出现跨域问题?
- 首先跨域指的是浏览器不能执行其它网站的脚本,它是由浏览器的同源策略造成的,是浏览器对JavaScript 施加的安全限制。
具体的解决方案是什么?
- 浏览器在执行脚本的时候,都会检查这个脚本属于哪个页面,即检查是否同源,只有同源的脚本才会被执行;而非同源的脚本在请求数据的时候,浏览器会报一个异常,提示拒绝访问。
- No 'Access-Control-Allow-Origin' header is present on the requested resource
浏览器的同源策略:是一种约定,是浏览器最核心也是最基本的安全功能,如果浏览器少了同源策略,则浏览器的正常功能可能都会受到影响。
同源: 协议、域名(IP)、端口相同即为同源
3、同源策略限制的情况:
- Cookie、LocalStorage 和 IndexDB 无法读取
- DOM 和 Js对象无法获得
- AJAX 请求不能
4、跨域问题
简单描述下:
有两台服务器分别为A,B,如果从服务器A的页面发送异步请求到服务器B获取数据,如果服务器A和服务器B不满足同源策略,则就会出现跨域问题。
解决方案
使用add_header指令,该指令可以用来添加一些头信息
语法
add_header name value…
默认值
http,server,location
此处用来解决跨域问题,需要添加两个头信息,一个是Access- Control-Allow-Origin , Access-Control-Allow-Methods
Access-Control-Allow-Origin: 直译过来是允许跨域访问的源地址信息,可以配置多个(多个用逗号分隔),也可以使用*代表所有源
Access-Control-Allow-Methods: 直译过来是允许跨域访问的请求方式,值可以为 GET POST PUT DELETE…,可以全部设置,也可以根据需要设置,多个用逗号分隔
具体配置方式//设置需要跨域的指定文件 location /getUser{ add_header Access-Control-Allow-Origin *; //设置允许所有主机 add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE; //设置允许GET,POST,PUT,DELETE方法 default_type application/json; return 200 '{"id":1,"name":"TOM","age":18}'; } //设置允许全局跨域 location { add_header Access-Control-Allow-Origin *; //设置允许所有主机 add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE; //设置允许GET,POST,PUT,DELETE方法 default_type application/json; return 200 '{"id":1,"name":"TOM","age":18}'; }
https://www.cnblogs.com/brianzhu/category/1182085.html nginx集合
https://www.cnblogs.com/BoatGina/p/8409549.html nginx跨域
https://cloud.tencent.com/developer/article/1721198 Linux系统下Nginx支持ipv6配置的方法
https://mp.weixin.qq.com/s/F5q9MFpz24cPbIUWgLWRRQ 优化 Ngin HTTPS 延迟
https://www.cnblogs.com/zjfjava/p/10947264.html Nginx如何限流
使用ngx_http_limit_req_module模块的两个参数
ngx_http_limit_req_module模块用于限制每个IP访问每个定义key的请求速率