美文网首页
初识nginx

初识nginx

作者: 求得浅欢风日好 | 来源:发表于2019-06-06 15:47 被阅读0次

    以下是文字版本:

    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

          本文链接:https://www.haomeiwen.com/subject/tlruxctx.html