您的位置:首页 > 运维架构 > Nginx

Nginx基础入门学习笔记

2020-06-01 04:42 591 查看

Nginx是一个高性能的HTTP和反向代理web服务器,是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强等。

1. 反向代理

  1. 正向代理(代理用户)
    客户端通过代理服务器访问网外网站。

  2. 反向代理(代理服务器)
    客户端只需要知道反代理服务器的地址,而不需要知道它后面的多个tomcat服务器的地址。

2. 负载均衡

增加服务器的数量,以降低对单个服务器的负载。

负载均衡策略:

添加负载均衡后,要在

location / {...}
中加入
proxy_pass http://myserver;
。(myserver为定义的负载均衡列表名)

  1. 轮询:默认方式(缺省配置)
    在轮询中,如果服务器down掉了,会自动剔除该服务器。
upstream myserver {
server  10.211.55.17:8080;
server  10.211.55.17:8081;
}
  1. weight:权重方式
    weight参数用于指定轮询几率,weight的默认值为1。weight越大,被访问的比率越大。
upstream myserver {
server  10.211.55.17:8080 weight=5;
server  10.211.55.17:8081 weight=10;
}
  1. ip_hash:依据ip分配方式
    客户端第一次访问到哪个服务器,之后会一直访问同一个服务器。也解决的session不能跨服务器的问题。
upstream myserver {
ip_hash;
server  10.211.55.17:8080;
server  10.211.55.17:8081;
}
  1. least_conn:最少连接方式
    把客户端的请求发给连接比较少的服务器,使服务器整体负载相同。
upstream myserver {
least_conn;
server  10.211.55.17:8080;
server  10.211.55.17:8081;
}
  1. fair(第三方):响应时间方式
    按照服务器端的响应时间来分配请求,响应时间短的优先分配。
upstream myserver {
server  10.211.55.17:8080;
server  10.211.55.17:8081;
fair;
}
  1. url_hash(第三方):依据URL分配方式
    按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,配合缓存使用。
upstream myserver {
hash $request_uri;
server  10.211.55.17:8080;
server  10.211.55.17:8081;
}

3. 动静分离

把静态资源和动态资源分别放在不同服务器上。

4. 高可用

高可用是为了解决只有一台nginx时,如果此时客户端发送请求,而nginx宕机了,请求就无法到达tomcat的问题。高可用是设置从nginx,如果主nginx宕机了,那么备nginx来实现反代理。
因为两个nginx的ip都是不一样的,所以对外需要一个虚拟ip,keepalived把虚拟ip挂到nginx1上,然后如同一个哨兵,检查nginx1的状态。当nginx1宕机了,keepalived就会把虚拟ip挂到nginx2上。

nginx常用命令

  1. cd /usr/local/nginx/sbin
    进入nginx目录

  2. ./nginx -v
    查看nginx的版本号

  3. ./nginx
    开启nginx

  4. ./nginx -s stop
    停止nginx

  5. ./nginx -s reload
    重新加载nginx

如果出现下面这种错误,需要用

./nginx -c /usr/local/nginx/conf/nginx.conf
指定配置文件重启。此时,nginx目录下的logs目录会生成nginx.pid文件,就可以使用
./nginx -s reload
命令重新加载nginx了。

nginx.conf配置文件

nginx.conf配置文件在nginx目录下的conf目录下,内容由全局块、events块和http块三部分组成。

建议拷贝一份nginx.conf,防止出现问题时恢复不了。

1. 全局块


#user nobody;
配置用户或者组,默认nobody
worker_processes 1;
允许生成的进程数,默认为1。
#error_log logs/error.log;
制定日志路径
#pid logs/nginx.pid;
指定nginx进程运行文件存放地址

2. events块


worker_connections 1024;
支持的最大连接数,默认1024

3. http块

http块由http全局块和server块组成。


  1. http全局块

include mime.types;
配置nginx支持哪些扩展名与文件类型映射表。在nginx/conf/mime.types可查看支持的文件类型。
default_type application/octet-stream;
默认文件类型(流),支持很多文件、图片、js/css等。
log_format main
自定义文件格式,默认即可。(文件的打印规则)
sendfile on;
优化参数,允许sendfile方式传输文件,开启高效传输模式。
#tcp_nopush on;
防止网络堵塞。
keepalive_timeout 65;
长连接超时时间(单位秒)
#gzip on;
开启gzip压缩

  1. server块(新版本nginx的server块在nginx.conf文件同个目录下的conf.d目录里的default.conf文件)

    listen 80;
    监听80端口
    server_name localhost;
    监听的地址
    location / { root html; index index.html index.htm; }
    在花括号里添加
    proxy_pass 转发地址;
    实现页面转发

nginx配置实例

需要在centos7下有jdk1.8,tomcat,nginx等环境。

准备工作:
  1. 进入tomcat的bin目录,

    ./startup.sh
    启动tomcat服务器。(此目录下
    ./shutdown.sh
    为关闭tomcat)

  2. 进入nginx的sbin目录,

    ./nginx
    启动nginx服务器(
    ./nginx -s stop
    为关闭)

  3. 开放8080和80端口

    firewall-cmd --add-port=80/tcp --permanent
    开放80端口
    firewall-cmd --add-port=8080/tcp --permanent
    开放8080端口
    (怕麻烦可临时关闭防火墙:
    systemctl stop firewalld.service
    (centos7的命令),临时关闭防火墙就不需要重启防火墙了)
    CentOS7 关闭和开启防火墙

  4. firewall-cmd --reload
    重启防火墙(开放新端口后需要重启防火墙)
    firewall-cmd --list-all
    查看开放的端口

  5. 此时,如果linux下的tomcat和nginx都启动了的话,在外的浏览器输入linux的ip冒号加80就可以访问nginx主页面,加8080就可以访问tomcat主页面。(linux的ip输入

    ifconfig
    查看)


一、反向代理

实例1
需求:

在浏览器中输入www.123.com,页面跳转到linux系统的tomcat主页面。

  1. 修改本地的host文件,让其在输入www.123.com跳转到10.211.55.17。
    (windows系统的host文件的路径:C:->Windows->System32->drivers->etc->HOSTS)
    打开终端:
    cd /private/etc
    进入/private/etc
    sudo vim hosts
    进入hosts文件,需要权限(输入本机密码)

    回车进入

    :wq!
    强制保存退出
  2. 然后在浏览器中输入www.123.com,页面成功跳转到10.211.55.17:80。
配置nginx.conf文件
  1. 把http块下面server块里的server_name修改为linux的ip。
  2. 然后在其下面几行的
    location / {...}
    中加入
    proxy_pass http://127.0.0.1:8080;
    让其跳转到tomcat的主页面。
  3. :wq
    保存退出后,在浏览器输入
    www.123.com
    成功跳转到tomcat的主页面。
  4. 如果输入
    www.123.com
    后是nginx的主页面,请到nginx的sbin目录下输入
    ./nginx -s reload
    重启nginx服务器,如果清除浏览器的缓存。
实例2
需求:

根据访问的路径跳转到不同端口的服务中
nginx监听8888端口
访问 http://10.211.55.17:8888/edu/a.html 跳转到127.0.0.1:8080/edu/a.html
访问 http://10.211.55.17:8888/vod/a.html 跳转到127.0.0.1:8081/vod/a.html

准备工作:
  1. 需要两个tomcat来实现我们的需求,所以解压我们的tomcat包。
  2. 进入tomcat2的conf目录,修改配置文件server.xml,让两个tomcat不冲突。
    这里以我的配置文件行数为例(一共需要改三处):
  • 修改22行,把8005改为8015。

  • 修改69行,把8080改为8081。

  • 修改119行,把8009改为8019。(注释也改,以防后面需要用到而忘改。)

  1. 然后进入两个tomcat的bin目录,

    ./startup.sh
    分别启动两个tomcat,进入nginx的sbin目录,
    ./nginx
    启动nginx。

  2. 添加8081端口。

    firewall-cmd --add-port=8081/tcp --permanent
    开放8081端口
    firewall-cmd --add-port=8888/tcp --permanent
    开放8888端口
    firewall-cmd --reload
    重启防火墙
    firewall-cmd --list-all
    查看开放的端口

  3. 在浏览器测试

  4. 页面能打开后,我们需要新建目录和网站,用于等会不同路径的页面跳转。进入tomcat的webapp目录。

      第一个tomcat新建edu目录,在目录下新建a.html,

    • 第二个tomcat新建vod目录,在目录下新建a.html。



准备工作完成,接下来配置nginx。

配置nginx.conf
  1. 进入nginx/conf/nginx.conf配置文件。
    改为
87     server {
88         listen       8888;
89         server_name  10.211.55.17;
90
91         location ~ /edu {
92                 proxy_pass http://127.0.0.1:8080;
93         }
94         location ~ /vod {
95                 proxy_pass http://127.0.0.1:8081;
96         }
97     }

  1. 打开浏览器输入10.211.55.17:8888,跳转成功。

  2. 访问 http://10.211.55.17:8888/edu/a.html跳转到127.0.0.1:8080/edu/a.html,跳转成功。

  3. 访问 http://10.211.55.17:8888/vod/a.html跳转到127.0.0.1:8081/vod/a.html,跳转成功。

二、负载均衡

需求:

浏览器中输入http://10.211.55.17/edu/a.html,实效负载均衡的效果,平均8080和8081端口中。

准备工作:

在两个tomcat的webapp目录下分别创建edu目录,在edu目录下创建a.html(之前8080的tomcat已经有edu和a.html了,所以只要在8081的tomcat创建就可以了)。

配置nginx.conf
  1. 修改nginx.conf配置文件
35     upstream myserver {
36         server  10.211.55.17:8080;
37         server  10.211.55.17:8081;
38
39     }
40
41     server {
42         listen       80;
43         server_name  10.211.55.17;
44
45         #charset koi8-r;
46
47         #access_log  logs/host.access.log  main;
48
49         location / {
50             proxy_pass http://myserver;
51             root   html;
52             #proxy_pass http://127.0.0.1:8080;
53             index  index.html index.htm;
54         }

  1. 重启nginx。(
    ./nginx -s reload
  2. 在浏览器输入http://10.211.55.17/edu/a.html,刷新几次会发现页面在8080和8081之间切换。

三、动静分离

准备工作:
  1. 新建一个data目录,在里面新建www和image两个目录,在www目录中新建一个a.html用于测试。



2. 在Mac的终端往linux的data/image目录复制图片。

scp o1.jpeg root@10.211.55.17:/data/image


配置nginx.conf文件:
  1. 修改nginx.conf文件
40     server {
41         listen       80;
42         server_name  10.211.55.17;
43
44         #charset koi8-r;
45
46         #access_log  logs/host.access.log  main;
47
48         location /www/ {
49             root   /data/;
50             index  index.html index.htm;
51         }
52         location /image/ {
53             root   /data/;
54             autoindex   on;
55         }

  1. 重启nginx。
  2. 在浏览器中输入http://10.211.55.17/image/,显示出image目录下的内容。
  3. 点击o1.jpeg成功跳转。
  4. 输入http://10.211.55.17/www/a.html,成功跳转。

四、高可用集群

需要两台nginx,一个keepalived脚本,一个虚拟ip。

准备工作:
  1. 两台nginx分别需要对应的linux系统(虚拟机直接使用连接克隆,可以快速获得一台一样的linux)。

  2. 如果使用克隆,需要把第二台linux中nginx.conf的监控路径改成新的ip。
  3. 启动两台nginx,然后在浏览器中测试。

  4. 在两台服务器上安装keepalived。
    yum install keepalived -y
    安装keepalived
    rpm -q -a keepalived
    查看安装的keepalived版本
修改配置文件:
  1. 先修改主机的keepalived的配置文件。(keepalived配置文件在/etc/keepalived/下)
    加了注释的都是需要改或者重要的(建议先备份一份keepalived.conf)。
1 ! Configuration File for keepalived
2
3 global_defs {  #全局定义
4    notification_email {
5      acassen@firewall.loc
6      failover@firewall.loc
7      sysadmin@firewall.loc
8    }
9    notification_email_from Alexandre.Cassen@firewall.loc
10    smtp_server 192.168.200.1
11    smtp_connect_timeout 30
12    router_id LVS_DEVEL
13    vrrp_skip_check_adv_addr
14    vrrp_strict
15    vrrp_garp_interval 0
16    vrrp_gna_interval 0
17    router_id 10.211.55.17	#访问到本服务器
18 }
19
20 vrrp_script chk_hhttp_port {    #检测脚本和权重的参数
21     script      "/usr/local/src/nginx_check.sh" #检测监本(先写个路径,等会再写脚本)
22     interval    2   #检测脚本执行的间隔
23     weight      2	#权重
24 }
25
26 vrrp_instance VI_1 {
27     state MASTER    #主,备份服务器为BACKUP
28     interface eth0   #网卡,ifconfig查看ip冒号前面为网卡
29     virtual_router_id 51  #主、备的virtual_router_id必须相同
30     priority 100        #优先级,主机的优先级大,备机小
31     advert_int 1
32     authentication {
33         auth_type PASS
34         auth_pass 1111
35     }
36     virtual_ipaddress {
37         10.211.55.100   #VRRP H虚拟地址
38     }
39 }
40 #       下面可不需要,可以都删了或者注释了
  1. 然后进入/usr/local/src/,新建nginx_check.sh文件。(这里因为使用的是root用户,所以有执行权限。如果是其他用户,需要先给权限)
1 #!/bin/bash
2 A=`ps -C nginx -no-header |wc -l`
3 if [ $A -eq 0 ];then
4         /usr/local/nginx/sbin/nginx
5         sleep 2
6         if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
7                 killall keepalived
8         fi
9 fi
  1. 修改备机的keepalived的配置文件。
    和上面的代码有三处不同:

      把17行的
      10.211.55.17
      换成
      10.211.55.20
    • 把27行的
      MASTER
      改为
      BACKUP
    • 把30行的
      100
      改为
      90
    • (用ifconfig查看网卡,如果网卡不同需要改28行)
  2. 然后进入/usr/local/src/,新建nginx_check.sh文件,复制上面代码。

  3. 重启两台nginx。

  4. 先启动nginx再启动keepalived。

    systemctl start keepalived.service

    ps -ef | grep keepalived
    查看keepalived进程。

  5. 然后在浏览器输入10.211.55.100,页面成功加载出来。

  6. 把主机的nginx停止,清除缓存然后重新访问。

    ./nginx -s stop
    停止nginx

keepalived.conf配置文件

  1. global_defs:全局配置
    最重要是:router_id。通过这个id可以访问到这个服务器,写本机ip。

  2. vrrp_script:脚本配置

    script:执行的检测脚本。
  3. interval:检测脚本的执行间隔(单位秒)
  4. weight:权重
  • vrrp_instance VI_1:虚拟ip配置

      state:服务器类型。(主服务器为MASTER,备份服务器为BACKUP)
    1. interface:本机绑定的网卡。
    2. virtual_router_id:主备机的id标识。(主、备的virtual_router_id必须相同)
    3. priority:优先级。(主机的优先级大,备机小)
      advert_int:检测服务器是否存活的时间间隔,默认1秒(单位秒)
      authentication { #权限校验
      auth_type PASS #格式为密码
      auth_pass 1111 #密码为1111
      }
      virtual_ipaddress { #可绑定多个虚拟ip
      10.211.55.100 #VRRP H虚拟地址
      }

    nginx原理

    1. master和worker
      nginx启动后会有master和worker两个进程。master只有一个,worker可以有多个,master负责管理分配任务,worker负责执行master分配下来的任务。

    2. worker的工作过程
      当client发送请求,首先到master,然后master把请求分担给worker,多个worker采用争抢的方式决定哪个worker获得请求,然后反向代理调用tomcat。

    3. 一个master和多个worker的好处

      可以使用
      nginx -s reload
      热部署(nginx不需要停止就可以让改过的配置文件生效)。
    4. 每个worker都是独立的进程,不需要加锁,其中如果有一个worker出现问题,其他worker可以继续进行争抢,实现请求过程,保证服务不被中断。
  • worker数和服务器的cpu数相同最合适。

  • 连接数worker_connection

      发送请求,占用了worker的几个连接数?
      答案:2个或者4个。
      情况一:如果请求只要静态资源,那么请求到worker,然后worker把资源响应回去,一来一回为2个。

      情况二:如果请求需要数据库的数据,那么发送请求到worker,worker发送给tomcat,让tomcat去数据库拿数据,然后,tomcat把数据给worker,worker再把数据响应给客户端,除了之前两个,还有和tomcat一来一回的两次。

    1. nginx有一个master,有四个worker,每个worker支持最大的连接数据为1024,支持的最大并发数是多少?
      答: worker最大支持的连接数:4 * 1024
      最大并发数:最大连接数 / (2或4)

    • 普通的静态访问最大并发数是:worker_connection * worker_processes / 2
    • 如果是HTTP作为反代理来说,最大并发数是:worker_connection * worker_processes / 4

    学习视频:
    https://www.bilibili.com/video/BV1zJ411w7SV?p=1

  • 内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: 
    相关文章推荐