初识nginx

以下是文字版本:

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的容量的前提下。

你可能感兴趣的:(初识nginx)