Nginx配置与简单使用(笔记)

Nginx web服务器使用

nginx Linux 安装

  • 安装依赖

    yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
    
  • 下载并解压安装包

    # 在/usr/local/src 创建nginx文件夹
    cd /usr/local/src/nginx
    # 下载tar包
    wget http://nginx.org/download/nginx-1.17.3.tar.gz
    
    tar -xf nginx-1.17.3.tar.gz
    
  • 执行 ./configure --prefix=/usr/local/nginx (其中 --prefix是指定nginx 安装路径 也就是最后安装到哪)

  • 执行 make

  • 执行 make install

nginx 相关命令

  • /usr/local/nginx/sbin/nginx -s reload # 重新载入配置文件

  • /usr/local/nginx/sbin/nginx -s reopen # 重启 Nginx

  • /usr/local/nginx/sbin/nginx -s stop # 停止 Nginx

nginx 配置文件 /conf/nginx.conf


#user  nobody; #  配置worker进程运行用户 默认为任何用户都可以
worker_processes  1; #配置工作进程数目,根据硬件调整,通常等于CPU数量或2倍与CPU数量

#error_log  logs/error.log; # 配置全局错误日志及类型 [debug|info|notice|warn|error|crit] 默认为error
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid; # 配置进程编号 pid文件

# 配置工作模式和连接数
events {
    # 配置事件模型
    # use epoll;
    
    # 配置每个worker进程连接数上限,nginx支持的总连接数就等于worker_processes * worker_connections 
    worker_connections  1024; # 最大可写55535
}

# 配置http服务器,利用他的反向代理功能提供负载均衡支持
http {
    include       mime.types; # 配置nginx支持哪些多媒体类型,可以在cong/mime.types中查看支持的多媒体类型
    default_type  application/octet-stream; # 默认文件流类型(一般支持大多数文件)
    
    # 配置日志格式
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';
    
    # 配置access.log日志及存放路径,并使用上面定义的main日志格式
    #access_log  logs/access.log  main;

    sendfile        on; # 开启搞高效文件传输模式
    #tcp_nopush     on; # 防止网络阻塞 在sendfile 开启后使用

    #keepalive_timeout  0;
    keepalive_timeout  65; # 连接时长 超时显示连接失败
    #tcp_nodelay    on; # 实时发送不进行等待 在keepalive开启后使用,提供网络包的传输实时性
    
    #gzip  on; # 开启gzip 压缩输出

    
    # 配置虚拟主机
    server {
        listen       80; # 配置监听端口
        server_name  localhost; # 配置服务名

        #charset koi8-r; # 配置字符集 通用UTF-8

        #access_log  logs/host.access.log  main; #配置本虚拟主机的访问日志

        # 默认 / 请求,当访问路径中出现 / 会被该location匹配到 并进行处理
        # 类似于路由的概念  / 路径为默认路径
        location / { # location 用于匹配路由 
            root   html;  # root 时配置服务器的默认网站根目录位置,默认为nginx安装目录下的html目录
            index  index.html index.htm; # 在html目录下查找index.html 配置首页文件的名称
        }

        #error_page  404              /404.html; # 配置 404 页面

        # redirect server error pages to the static page /50x.html #配置50x 页面
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html { # location = /50x.html  表示 精确匹配
            root   html; # 去html 目录下查看 50x.html
        }
        # PHP脚本请求全部转发到Apache 处理
        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # PHP脚本请求全部转发到FastCGI处理
        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # 禁止访问 .htaccess文件  防止外网访问的文件
        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        # 
        #location ~ /\.ht {
        #    deny  all;
        #}
    }

    # 另一个混合使用基于IP、名称和端口的配置的虚拟主机
    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # 配置HTTPS 服务
    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem; # 证书
    #    ssl_certificate_key  cert.key; # 证书公钥

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

nginx的主要应用

静态网站

server{
    listen 80;# 端口号
    # ip + port = root root也就是项目文件所在目录
    location /{
        root /opt/www/ # 静态文件路径
        index index.html # 静态文件
    }
}

server {
        listen       8080; # 配置监听端口
        server_name  localhost; # 配置服务名

        #charset koi8-r; # 配置字符集 通用UTF-8

        #access_log  logs/host.access.log  main; #配置本虚拟主机的访问日志

        # 配置路由 www文件夹与nginx.exe 同级目录
        location / { # location 用于匹配路由 
            root   www;  # root 时配置服务器的默认网站根目录位置,默认为nginx安装目录下的html目录
            index  index.html index.htm; # 在html目录下查找index.html 配置首页文件的名称
        }
        # 配置404 页面
        error_page  404              /404.html; # 配置 404 页面
        location = /404.html {
            root    www;
        }

        # 配置50x 页面
        error_page   500 502 503 504  /50x.html;
        location = /50x.html { # location = /50x.html  表示 精确匹配
            root   www; # 去html 目录下查看 50x.html
        }
 }

负载均衡

  • 负载均衡概述

    网站创立初期,我们一般都使用单台及其对外提供集中式服务,但随着业务量的正大,我们一台服务器不够用,此时就会把多台服务器组成一个集群对外提供服务;但是,我们网站对外提供的访问入口通常只有一个,比如www.xxx.com;那么当用户访问 www.xxx.com的时候,如何将用户的请求分发到集群中不同的机器上呢,这就是负载均衡要做的事情;负载均衡通常是指将请求“均匀”分摊到集群中多个服务器节点上执行,这里的均匀是指在一个较大的统计范围内是基本均匀的,并不是完全均匀

  • 负载均衡实现方式:

    • 硬件的负载均衡
      • 比如F5、深信服、Array等;优点是有厂商专业的技术服务团队提供支持;性能稳定;缺点是费用昂贵,对应规模较小的网络应用成本高
    • 软件的负载均衡
      • 比如 Nginx、LVS、HAProxy等;免费开源,成本低廉
  • Nginx 实现负载均衡

    • Nginx实现负载均衡:通过在Nginx的nginx.conf中 进行配置即可

      image
    • 配置如下

      1. 在http模块中加入:
      upstream test {
          server  127.0.0.1:8000 weight=3;
          server  127.0.0.1:8001 weight=1;
      }
      

      其中 weight 表示权重,用于后端服务器性能不均的情况,访问比率约等于权重之比,权重越大访问的机会越大;

      upstream 是配置nginx与后端服务器负载均衡非常重要的一个模块,并且它还能对后端的服务器的健康状态进行检查,若后端服务器中一台发生故障,则客户端的请求不会转发到该故障机器

      1. 在server模块中添加:
      location / { # 访问项目某个路径时
          # 代理转发的地址 域名或地址和端口
          proxy_pass http://test;  # http:// 必须存在
      }
      

      其中location中 的www.xxx.com字符串要和 upstream 后面的字符串相同

    image
  • 负载均衡常用策略

    • 轮询(默认):

      每个请求轮流分配到不同的后端服务器,如果后端服务器挂掉或假死,将自动剔除,不在进行分配;

      upstream demo{
          server 127.0.0.1:8000;
          server 127.0.0.1:8001;
      }
      
    • 权重

      每个请求按比例分发到不同的后端服务器,weight的值越大,访问的几率越大,用于后端服务器性能不均

      upstream demo{
          server 127.0.0.1:8000 weight=2;
          server 127.0.0.1:8001 weight=2;
      }
      
    • ip_hash

      ip_hash也叫IP绑定,每个请求按照ip的hash值分配,这样每个访问客户端会固定访问一个后端服务器,可以解决session会话丢失问题

      # 通过hash("ip")%服务器的台数 = 结果匹配到对应的ip
      # hash('183.199.76.201')% 2 = 1 因此会匹配到 127.0.0.1:8001
      upstream demo{
          ip_hash;
          server 127.0.0.1:8000;
          server 127.0.0.1:8001;
      }
      
    • 最少连接

      web请求会转发到连接数最少的服务器上

      upstream demo{
          least_conn;
          server 127.0.0.1:8000;
          server 127.0.0.1:8001;
      }
      
    • 其他配置

      • backup(预备机器) 其他所有的非backup机器down的时候,才请求backup机器

        upstream demo{
          server 127.0.0.1:8000;
          server 127.0.0.1:8001 backup;
        }
        
      • down(停止机器) 当前的server为down状态,不参与负载均衡

        upstream demo{
          server 127.0.0.1:8000;
          server 127.0.0.1:8001 down;
        }
        

静态代理

把所有的静态资源的访问改为访问nginx,而不是再去访问tomact ,因为nginx更擅长与静态资源的处理,性能更好,效率更高

所有在实际应用中,我们将静态资源比如图片、css、html、js等交割给nginx 处理,而不是由tomcat处理;

通过在nginx.conf 配置文件中添加静态资源的文件名

放置静态资源的目录,要注意目录权限的问题

location ~ .*\.(js|css|html|htm|gif|png|jpg|jpeg|bmp|swf|icon|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|mp4|wma)$ {
    root static;
}
# 当 访问页面图片为 /src/img/001.jpg
# 那么 是访问的 static/src/img/001.jpg

通过在nginx.conf配置文件中配置静态资源所在目录实现

location ~ .*/(css|img|js|images){
    root static
}

# 当 访问页面图片为 demo/img/001.jpg 
# 那么 nginx可以匹配到 img 就会去static/img中寻找001.jpg

我们将静态资源放入 /static 目录下,然后用户访问时由nginx 返回这些静态资源

配置如下

// 创建一个服务器
const express = require('express')
const path = require('path')

let app = express()

app.get('/',(req,res)=>{
    // 发送响应 一个html的img图片
    res.send('<img src="/src/image/2444379.png"/ art="图片">')
})

app.listen(8000,(err) => {
    if(err) throw err
    console.log('服务器开启成功')
})
# 配置nginx

worker_processes  1; 

events {
    worker_connections  1024;
}


http {
    include       mime.types; 
    default_type  application/octet-stream; 
    sendfile        on; 
    keepalive_timeout  65; 
    upstream resource {
        server  127.0.0.1:8000;
    }

    server {
        listen       80; 
        server_name  localhost; 
        location / {
            proxy_pass  http://resource;
        }
        
        # 访问图片
        location ~ .*\.(js|css|html|htm|gif|png|jpg|jpeg|bmp|swf|icon|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|mp4|wma)$ {
            root static;
        }
        
        error_page   500 502 503 504  /50x.html;
        location = /50x.html { 
            root   html; 
        }
    }
}

动静分离

Nginx 的负载均衡和静态代理结合在一起,我们就可以实现动静分离,这是实际应用中常见的一种场景;

动态资源,如jsp有tomact或其他web服务器完成

静态资源,如图片、css、js等由nginx服务器完成

配置如下

// 8000 服务器
const express = require('express')
const path = require('path')

let app = express()

app.get('/',(req,res)=>{
    res.send('<img src="/src/image/2444379.png"/ art="图片">')
})

app.listen(8001,(err) => {
    if(err) throw err
    console.log('服务器开启成功')
})

// 8001 服务器
const express = require('express')
const path = require('path')

let app = express()

app.get('/',(req,res)=>{
    res.send('<img src="/src/image/2444379.png"/ art="图片">')
})

app.listen(8001,(err) => {
    if(err) throw err
    console.log('服务器开启成功')
})
worker_processes  1; 
events {
    worker_connections  1024;
}

http {
    include       mime.types; 
    default_type  application/octet-stream; 
    
    sendfile        on; 
    
    keepalive_timeout  65; 

    # 配置 动态资源
    upstream resource {
        server  127.0.0.1:8000;
        server  127.0.0.1:8001;
    }
    
    # 配置 静态资源
    upstream staticResource {
        server 127.0.0.1:8080;
    }

    server {
        listen       80; 
        server_name  localhost; 
        location / {
            proxy_pass  http://resource;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html { 
            root   html; 
        }
    }

    server {
        listen       8080;
        server_name  localhost;
        # 访问图片
        # location ~ .*\.(js|css|html|htm|gif|png|jpg|jpeg|bmp|swf|icon|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|mp4|wma)$ {
        #   root static;
        # }
        
        location ~ .*/(css|img|js|images){
            root static;
        }
    }
}

虚拟主机

虚拟主机,就是把一台物理服务器划分成多个 “ 虚拟 ” 的服务器,这样我们的一台物理服务器就可以当做多个服务器来使用,从而配置多个服务器;

Nginx提供虚拟主机的功能,就是为了让我们不需要安装对个Nginx,就可以运行多个网站

Nginx下,一个server标签就是一个虚拟主机

nginx的虚拟主机就是通过nginx.conf 中 server 节点指定的 , 想要设置多个虚拟主机,配置多个server即可

  • 基于端口的虚拟主机

    • 基于端口的虚拟主机配置,使用端口来区分

    • 浏览器使用 同一个域名 + 端口 或 同一个IP地址 + 端口访问

      server {
          listen       80; 
          server_name  localhost; 
          location / {
              proxy_pass  http://resource;
          }
      }
      server {
          listen       81; 
          server_name  localhost; 
          location / {
              proxy_pass  http://resource;
          }
      }
      
  • 基于域名的虚拟主机

    • 基于域名的虚拟主机是最常见的一种虚拟主机

      server {
          listen       80; 
          server_name  www.shop.com; 
          location / {
              root   www;
              index  index.html index.htm; 
          }
      }
      
  • 配置虚拟主机

    # 此时域名无法被解析 需要修改hosts文件
    server {
        listen       80; 
        server_name  myblogsing.com; 
        location / {
            root   www;
            index  index.html index.htm; 
        }
    }
    
    • 修改hosts文件,实现本地域名重定向

      • C:\Windows\System32\drivers\etc\hosts 文件
      # Copyright (c) 1993-2009 Microsoft Corp.
      #
      # This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
      #
      # This file contains the mappings of IP addresses to host names. Each
      # entry should be kept on an individual line. The IP address should
      # be placed in the first column followed by the corresponding host name.
      # The IP address and the host name should be separated by at least one
      # space.
      #
      # Additionally, comments (such as these) may be inserted on individual
      # lines or following the machine name denoted by a '#' symbol.
      #
      # For example:
      #
      #      102.54.94.97     rhino.acme.com          # source server
      #       38.25.63.10     x.acme.com              # x client host
      
      # localhost name resolution is handled within DNS itself.
      #   127.0.0.1       localhost
      #   ::1             localhost
      # 新增 域名重定向
      127.0.0.1   myblogsing.com
      
  • 使用include 的方式引入虚拟主机配置
    • include /test/demo.conf
    • 将虚拟目录的配置文件加入到“http{}” 部分的末尾,与其他server并列

nginx 安装模块

gzip

  • gzip on : 打开或关闭gzip

  • gzip_buffers : 设置用于处理请求亚索的缓冲器数量和大小

    gzip  on;
    #32 4k 表示安装内存页大小 以4k为单位,申请32倍内存空间
    gzip_buffers  32 4k|16 8k;
    
  • gzip_comp_level :设置gzip压缩几倍,级别越低压缩速度越快文件压缩比越小,反速度越慢文件压缩比越大

    gzip  on;
    gzip_comp_level   1;
    

    我们以一个大小为92.6K的脚本文件为例,如下所示。其中最后三个数值分别表示压缩比、包大小、平均处理时间(使用ab压测,100用户并发下, ./ab -n 10000 -c 100 -H 'Accept-Encoding: gzip' http://10.27.180.75/jquery.js )以及CPU消耗。

    从这我们可以得出结论:

    • 随着压缩级别的升高,压缩比有所提高,但到了级别6后,很难再提高;
    • 随着压缩级别的升高,处理时间明显变慢;
    • gzip很消耗cpu的性能,高并发情况下cpu达到100%;

    因此,建议:

    • 不是压缩级别越高越好,其实gzip_comp_level 1的压缩能力已经够用了,后面级别越高,压缩的比例其实增长不大,反而很吃处理性能。
    • 压缩一定要和静态资源缓存相结合,缓存压缩后的版本,否则每次都压缩高负载下服务器肯定吃不住。
  • **gzip_disable 通过表达式,表明那些UserAgent有不使用gzip **

    Syntax: gzip_disable regex ...;
    Default:    —
    Context:    http, server, location
    This directive appeared in version 0.6.23.
    
  • gzip_min_length: 当返回内容大于此指时才会使用gzip进行压缩 以k为单位,所有页面都压缩

    gzip  on;
    gzip_min_length 20;
    
  • gzip_http_version: 识别http版本,早期浏览器不支持gzip,因此添加该属性

    gzip  on;
    gzip_http_version 1.1;
    
  • gzip_proxied

    Nginx做为反向代理的时候启用:

    • off – 关闭所有的代理结果数据压缩
    • expired – 如果header中包含”Expires”头信息,启用压缩
    • no-cache – 如果header中包含”Cache-Control:no-cache”头信息,启用压缩
    • no-store – 如果header中包含”Cache-Control:no-store”头信息,启用压缩
    • private – 如果header中包含”Cache-Control:private”头信息,启用压缩
    • no_last_modified – 启用压缩,如果header中包含”Last_Modified”头信息,启用压缩
    • no_etag – 启用压缩,如果header中包含“ETag”头信息,启用压缩
    • auth – 启用压缩,如果header中包含“Authorization”头信息,启用压缩
    • any – 无条件压缩所有结果数据
    Syntax: gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;
    Default:    
    gzip_proxied off;
    Context:    http, server, location
    
  • gzip_vary: 增加响应头“Vary : Accept-Encoding”

    Syntax: gzip_vary on | off;
    Default:    
    gzip_vary off;
    Context:    http, server, location
    
  • gzip_types 设置需要压缩的MIME类型,如果不在设置类型范围内的请求不进行压缩

    字体类型扩展名 Content-type
    .eot application/vnd.ms-fontobject
    .ttf font/ttf
    .otf font/opentype
    .woff font/x-woff
    .svg image/svg+xml

浏览器过期设置

  • 设置缓存过期 expires expires 20h
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,755评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,369评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,799评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,910评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,096评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,159评论 3 411
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,917评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,360评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,673评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,814评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,509评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,156评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,123评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,641评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,728评论 2 351

推荐阅读更多精彩内容