以下是文字版本:
nginx的三个主要应用场景:
静态资源服务
通过本地文件系统提供服务
比如常见的HTML、CSS、js文件。
反向代理服务
缓存加速
反向代理一般位于企业内网的边缘,不停地访问可能会很慢。所以把所有用户看起来不变的,或者一段时间不变的内容放在nginx上缓存下来,加速访问。
负载均衡
API服务
OpenResty
可以直接访问数据库/缓存数据库。
nginx为什么会出现:
本世纪,摩尔定律在单颗CPU上已经失效了。CPU开始向多核方向发展。
8颗CPU的系统提升到16颗CPU,性能并不会翻倍,主要是因为:操作系统和软件没有做好多核架构的准备。
比如Apache,一个进程同一时间只会处理一个请求。它实际上在使用操作系统进程切换的一个特性。而进程切换消耗性能太高了。
nginx正是因为这个而产生的。
nginx的优点:
高并发、高性能同时具备。
高并发只要我们对每个连接所使用的内存尽量少就可以。
可扩展性
高可靠性
允许nginx宕机的时间,一年之内可能只有1秒。
热部署
不停止服务的情况下升级nginx。
nginx上可能跑了几百万个并发连接,普通服务可能只用kill掉进程就可以。而如果kill掉nginx进程,会让操作系统给所有连接的客户端发送一个reset数据包,很多客户端是不能处理这个请求的,可能会导致恶性结果。
BSD许可证
这个许可证是说,nginx不仅仅是开源的,而且在有定制需求的场景下,修改nginx的源代码,用于商业应用,这是合法的。
nginx的组成:
nginx二进制可执行文件
由各模块源码编译出的一个文件。
nginx.conf
控制nginx的行为。
acces.log
记录每一条http请求信息
error.log
定位问题。
nginx命令行
nginx -? -j
显示帮助信息
nginx -g
指定配置指令
nginx -p
指定运行目录了
会替换掉在nginx.conf文件中定义好的运行目录。
nginx -c
启动时指定配置文件。
nginx -s
给nginx发送指令
stop
立刻停止服务。
quit
优雅地停止服务
reload
重载配置文件。
nginx -t
测试配置文件是否有错误。
reopen:日志切割
先把access.log备份
mv access.log.bak
nginx -s reopen
这个命令会生成一个新的名为access.log的访问日志文件。
kill -USR1master_pid
给nginx的master进程发送USR1信号和reopen是等同的。
我们一般一周备份一下access.log文件,可以把备份的过程写成一个shell脚本,然后添加到crontab中。
nginx热部署方法:
进行热部署,只需要替换掉nginx的二进制文件就可以,其他的nginx.conf, access.log,error.log都是不需要动的。
把自己编译好的nginx二进制文件复制到/usr/sbin/目录下,覆盖掉原来的nginx文件,可以先把原来的nginx二进制文件备份。
找出现在运行的nginx的master进程的PID
执行ps -elf|grep nginx。假设结果为5058
对master进程发送信号。
kill -USR2 5058
现在,可以看到新启动了一个master进程和其带有的worker进程。
这个新启动的进程是基于新的nginx二进制日志文件的。
再对老的master进程发送信号
kill -WINCH 5058
老的master进程的worker进程就消失了。
所有的连接请求也平滑的过渡到了新的master进程上了。
但是此时还保留着老的master进程,它是不会自动退出的。这样做是为了版本回退,我们有可能会发生一些问题,需要把新版本退回到老版本。
http配置的指令块:
http
表示http大括号里边所有的指令都是http模块去解析、执行的。
upstream
上游服务。
当nginx需要与Tomcat、Django等,其他内网的服务交互的时候,可以定义一个upstream。
server
对应的一个域名,或者一组域名。
location
一个URL表达式。
搭建一个可用的静态资源服务器
/etc/nginx/nginx.conf
http代码块
gzip相关字段:
一般都是要打开的,因为在传输过程中,的确能省很多流量。
gzip on;
打开传输压缩。
打开压缩之后,在response header中可以看到encoding-type:gzip字段
gzip_min_length 1;
小于1字节的不压缩。
gzip_comp_level 2;
压缩级别
gzip_types text/plain text/css text/javascript image/jpeg image/gif image/png;
压缩类型。
log_format
log_formatmain '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';
对设置的日志格式要有命名,这里为main。因为我们可能需要在不同域名下使用不同的日志格式;或者不同用途时记录不同日志格式。
access_log /var/log/nginx/access.logmain;
access日志记录到后边的文件中,而且使用main这种格式。
location代码块
set命令
set $limit_rate 1K;
限制服务器向客户端发送数据的速率为1K/s
反向代理和缓存服务器
模拟搭建一个反向代理:
先让nginx只能本地访问。
listen 127.0.0.1: 8080 default_server ;
默认情况下,只有端口,在端口前边加了ip地址后,就只能这个机器来访问了。
这里我们限制的是只能本机来访问这个端口。而且还得是curl 127.0.0.1
一定要ss -nutlp |grep 80,看一下nginx有没有还在监听别的端口。如果http模块中还有其他server的话,nginx还会监听多个端口的。
现在模拟了提供静态资源的nginx只能通过本机访问。
再开启一个nginx服务当做反向代理。在这个反向代理的配置文件中作如下修改:
upstreamlocal{ server 127.0.0.1:8080;}
添加一个或者一组上游服务器,并取名字为local。
server { listen 80; location / { proxy_pass http://local;alias /usr/share/nginx/html/; }
在server里边添加proxy_pass字段。把值设置为刚才名为local的upstream。
在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;
启动nginx反向代理服务器 nginx -c /root/nginx.conf
/root/nginx.conf是反向代理的配置文件的位置。
这样在一台机器上就生成了两个nginx 的master进程。
在非本地,访问不了作为静态资源的nginx,但是可以访问到nginx反向代理,它去帮我们访问静态资源的nginx。
在nginx反向代理基础上搭建缓存服务器:
配置反向代理nginx的配置文件
在http代码块,添加如下。
proxy_cache_path /tmp/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
在server代码块,添加如下字段。
proxy_cache my_cache;
proxy_cache_key $host$uri$is_args$args;
proxy_cache_valid 200 304 302 1d;
还要在server代码块,注释掉proxy_pass字段。
或许设置某些参数之后,不注释掉这个字段也可以。但是目前我只能注释掉才生效。
访问一次nginx代理。
关掉nginx静态资源服务器。
再次访问nginx代理,还是能够得到资源,因为nginx代理把资源缓存起来了。
GoAccess可视化和实时分析access.log
安装goaccess
yum -y install goaccess
如果yum安装不上,可以从别的机器上用yum,指定downloadonly选项,下载rpm包,然后拷贝到这里。
goaccess access.log -o/tmp/report.html--real-time-html --time-format='%H:%M:%S' --date-format='%d-%b-%Y' --log-format=COMBINED
修改nginx的配置文件,添加如下代码块:
location /report.html { alias/tmp/report.html; }
红色的地址是上边goaccess命令生成的。
在浏览器的地址栏中输入:http://192.168.188.60/report.html
现在就可以看到对这台机器的accesslog的实时监控信息了。
用免费SSL证书实现一个HTTPS站点
yum -y install python2-certbot-nginx
certbot --nginx -d domain_name
这里的domain_name 必须是在互联网上申请到的。
执行这个步骤就可以把网站转换成https的了,会在我们的/etc/nginx/nginx.conf文件中添加很多配置信息。例如:
ssl_session_cache shared: le_nginx_SSL:1m;
这一条说明TLS最耗费时间的就是握手,它增加了一个session_cache,大小是1MB。大概能为4000个https建立连接服务。每个https我收简历第一次连接之后,如果断开了,再次连接时,在session_timeout时间之内时,可以不用再次握手的,我们可以复用之前的秘钥。
ssl_session_timeout 1440m;
session_timeout设置的是24个小时。https连接建立之后,默认能够保存24个小时,如果没有超过session_cache的容量的前提下。