基础
CentOS7中使用yum安装Nginx的方法
1、添加源
默认情况Centos7中无Nginx的源,最近发现Nginx官网提供了Centos的源地址。因此可以如下执行命令添加源:
1 | sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm |
2、安装Nginx
通过yum search nginx看看是否已经添加源成功。如果成功则执行下列命令安装Nginx。
1 | sudo yum install -y nginx |
3、启动Nginx并设置开机自动运行
1 | sudo systemctl start nginx.service |
4、浏览查看效果
在浏览器中输入您的服务器地址
nginx 安装
下载nginx
wget http://nginx.org/download/nginx-1.10.1.tar.gz
进行解压
tar -zxvf nginx-1.10.1.tar.gz
安装nginx必须的相关包
yum install -y pcre-devel openssl-devel yum install gcc-c++
配置nginx安装环境
cd nginx-1.10.1 ./configure --with-http_stub_status_module --with-http_ssl_module
安装nginx
make && make install
启动:
/usr/local/nginx/sbin/nginx
关闭:
/usr/local/nginx/sbin/nginx -s stop
重启 nginx 服务:
/usr/local/nginx/sbin/nginx -s reload
配置nginx负载均衡
修改/usr/local/nginx/conf/nginx.conf
微程序缓存
简介
NGINX 和 NGINX Plus 被广泛应用于网站内容缓存,微程序缓存通过将动态、非个人化的内容缓存很短的时间,能有效加速这些内容的传递。
适合缓存的动态内容包括:
- 经常更新的新闻或博客网站的首页,每隔几秒就有新文章发布
- 最近资讯 RSS
- 持续整合(CI)或搭建平台的进度页面
- 库存、进度或筹款计数
- 彩票开奖结果
- 日历数据
在客户端呈现的个人化动态内容,例如利用 cookie 数据展示的广告内容或数据(“你好,你的名字”)
动态内容的微程序缓存
微程序缓存是一种缓存技术,将内容缓存1秒左右很短的时间。这意味着网站更新会延迟不到1秒钟,这在很多情况下是可以接受的。
利用 NGINX 来加速服务
第一步: 通过 NGINX 代理服务器
第二步: 启动短期缓存
在服务器配置中只添加了两条指令,NGINX 或 NGINX Plus 就可以缓存所有可缓存的响应。带有 200 OK 状态码的响应只缓存1秒钟
proxy_cache_path /tmp/cache keys_zone=cache:10m levels=1:2 inactive=600s max_size=100m; server { proxy_cache cache; proxy_cache_valid 200 1s; ... }
从每秒钟处理5条请求到600条
需要在确保缓存内容最新的情况下,尽可能少地向上游源服务器转发请求。在缓存内容不断更新的前提下,笔者愿意从缓存获取旧的(延后1到2秒)响应。要实现这一目标,需要添加两条指令:
proxy_cache_lock ——限制填充缓存的并发尝试数量,这样当一条缓存入口被创建后,对该资源的请求将会在 NGINX 中排队。 proxy_cache_use_stale ——配置 NGINX,使它提供旧的(最近缓存的)内容,同时更新缓存入口。
加上之前已经添加的缓存指令,笔者得到如下服务器配置:
server { proxy_cache one; proxy_cache_lock on; proxy_cache_valid 200 1s; proxy_cache_use_stale updating; ... }
每秒钟的请求数量从600跳跃到接近2200
了解更多信息,请查阅以下资源:
利用 NGINX 缓存指南——概述和方法介绍 内容缓存——NGINX Plus 向导 利用 NGINX Plus 进行内容缓存— NGINX Plus 功能描述
实战
http 强转https
rewrite
因为rewrite 需要使用正则去匹配,本来https就会有相对http有一些性能上的消耗,在增加更多的正则,会造成更多的性能消耗。
server { listen 80; #统配拦截所有域名 server_name *.toutiao.com; #判断端口是80然后做重定向 if ($server_port = "80"){ rewrite ^(.*)$ https://$host$1 permanent; } }
return
推荐使用return,return就是告诉你到此结束,语义明确 。
server { listen 80; #统配拦截所有域名 server_name *.toutiao.com; #判断端口是80然后做重定向 if ($server_port = "80"){ #301 是永久重定向,相当于permanent return 301 https://$server_name$request_uri; } }
Nginx SSL+tomcat集群配置需要注意
https://www.toutiao.com/i6366765491389727234/
- 配置 Nginx 的转发选项:
1 | proxy_set_header Host $host; |
- 配置Tomcat server.xml 的 Engine 模块下配置一个 Valve:
1 | <Valve className="org.apache.catalina.valves.RemoteIpValve" |
配置双方的 X-Forwarded-Proto 就是为了正确地识别实际用户发出的协议是 http 还是 https。
按天切割访问日志并删除超过一个月的日志
https://www.toutiao.com/i6375731838341612034/
日志位置
/data/logs/nginx
下面存放多个站点的访问日志,切割后的日志放在/data/logs/nginx/backup目录下面,某个站点单独一个目录,每个目录下面记录最近30天的访问日志
日志命名规则
站点域名:www.timophp.com
日志名称:www.timophp.com.access.log
站点域名:s1.static.timophp.com
日志名称:s1.static.timophp.access.log
备份日志名称
/data/logs/nginx/backup/www.timophp.com/access.20170117.log
日志切割脚本
nginx_access_log_cut.sh
1 | #初始化 |
日志切割脚本位置
这个随意,我就把他放在/data/script下面
增加定时任务crontab
1 | 0 0 * * */data/script/nginx_access_log_cut.sh > /dev/null2>&1 |
使用Nginx搭建视频直播服务器
==亲验,可行!==
https://www.toutiao.com/i6315159435152982530/?group_id=6316744795554595073&group_flags=0
- 下载RTMP模块
官网地址:https://github.com/arut/nginx-rtmp-module
我们直接输入如下命令
wget https://github.com/arut/nginx-rtmp-module/archive/master.zip
unzip master.zip
- 下载安装nginx
1 | wget http://nginx.org/download/nginx-1.13.8.tar.gz |
- 配置rtmp流
1 | cd /usr/nginx-1.13.8/ |
增加如下的代码,详细的配置可以看rtmp模块的github这里,我这里只是简单创建一个直播的应用
1 | rtmp { |
重启nginx
/usr/nginx-1.13.8/sbin/nginx
推流与拉流
直播分为推流和拉流,推流就是将视频流发往直播服务器端,而拉流就是将视频流获取到播放器。
比较常见的推流软件OBS,可以在官方网站下载:https://obsproject.com/
可以设置自己服务器的地址
rtmp://192.168.1.100/live
点击开始串流就可以进行推流了
拉流数据可以使用VLC播放器
http://vlc-media-player.en.softonic.com/
设置自己服务器的地址
rtmp://192.168.1.100/live
输入后点击播放就可以了
- 应用
- Android使用ijkplayer+nginx进行视频直播
https://www.toutiao.com/i6317047669256618498/
- ios使用ijkplayer+nginx进行视频直播
https://www.toutiao.com/i6317447470469087745/
性能优化与压力测试
- conf配置
1 | worker_processes auto; |
worker_processes 定义了nginx对外提供web服务时的worker进程数。最优值取决于许多因素,包括(但不限于)CPU核的数量、存储 数据的硬盘数量及负载模式。不能确定的时候,将其设置为可用的CPU内核数将是一个好的开始(设置为“auto”将尝试自动检测它)
1 | worker_rlimit_nofile 100000; |
==worker_rlimit_nofile 更改worker进程的最大打开文件数限制。如果没设置的话,这个值为操作系统的限制。设置后你的操作系统和 Nginx可以处理比“ulimit -a”更多的文件,所以把这个值设高,这样nginx就不会有“too many open files”问题了。==
Events模块
events模块中包含nginx中所有处理连接的设置。
1 | events { |
worker_connections 设置可由一个worker进程同时打开的最大连接数。如果设置了上面提到的worker_rlimit_nofile,我们可以将这个值 设得很高。 记住,最大客户数也由系统的可用socket连接数限制(~ 64K),所以设置不切实际的高没什么好处。
multi_accept 告诉nginx收到一个新连接通知后接受尽可能多的连接。 u
se 设置用于复用客户端线程的轮询方法。如果你使用Linux 2.6+,你应该使用epoll。如果你使用*BSD,你应该使用kqueue。 (值得注意的是如果你不知道Nginx该使用哪种轮询方法的话,它会选择一个最适合你操作系统的)
- 压力测试
- 并发200时
1 | webbench -c 200 -t 60 http://www.loudsay.com/index.php |
参数解释:-c为并发数,-t为时间(秒)
Speed=1454 pages/min, 2153340 bytes/sec.
Requests: 1454 susceed, 0 failed.
当并发200时,网站访问速度正常
并发800时
Speed=1194 pages/min, 2057881 bytes/sec. Requests: 1185 susceed, 9 failed. 当并发连接为800时,网站访问速度稍慢
并发1600时
Speed=1256 pages/min, 1983506 bytes/sec. Requests: 1183 susceed, 73 failed. 当并发连接为1600时,网站访问速度便非常慢了
并发2000时
Speed=2154 pages/min, 1968292 bytes/sec. Requests: 2076 susceed, 78 failed. 当并发2000时,网站便出现“502 Bad Gateway”,由此可见web服务器已无法再处理用户访问请求
./configure –prefix=/usr/nginx-1.13.8 –with-http_ssl_module –add-module=../nginx-rtmp-module-master
Nginx反向代理Websocket
- 基础
WebSocket握手是通过HTTP来完成的
NGINX通过允许一个在客户端和后端服务器之间建立的隧道来支持WebSocket。为了NGINX发送来至于客户端Upgrade请求到后端服务器,Upgrade和Connection头部必须被设置明确。
- 配置
实测可行
1 | upstream wsbackend { |
Nginx根据浏览器类型切换手机版和桌面版
1 | server { |
强转https跳转内部非https
1 | server { |
问题汇总
Post请求静态页面报错 405 Method not allowed
新浪微博轻应用开发时,会通过post请求设置的静态页面
有两种解决方法
a 重定向 405 错误码到 200
location ~ ^/(js/sandbox|uploads/rs|img)/ { root /data/runjs/webapp; error_page 405 =200 $uri; }
b 修改 Nginx 源码
修改文件 /www/nginx-1.10.1/src/http/modules/ngx_http_static_module.c 找到如下行(大约在文件的第206行): if (r->method & NGX_HTTP_POST) { return NGX_HTTP_NOT_ALLOWED; } 将这段屏蔽掉; /* if (r->method & NGX_HTTP_POST) { return NGX_HTTP_NOT_ALLOWED; } */ 保存推出; cd /www/nginx-1.10.1/ 然后重新编译 make ,不要 make install 然后把编译生成的 nginx 文件复制到 sbin 下替换原有 nginx 文件 cp objs/nginx /usr/local/nginx/sbin/ 停止 nginx /usr/local/nginx/sbin/nginx -s stop 启动 nginx /usr/local/nginx/sbin/nginx
Starting nginx: nginx: [emerg] bind() to 0.0.0.0:8091 failed (13: Permission denied)
开启selinux 导致的。
1、临时关闭selinux
setenforce 0 ##设置SELinux 成为permissive模式
setenforce 1 ##设置SELinux 成为enforcing模式
2、永久关闭selinux,
修改/etc/selinux/config 文件
将SELINUX=enforcing改为SELINUX=disabled
重启机器即可
a