浅谈Nginx

113 阅读7分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

1.概念

1.1 什么是nginx

www.nginx.com/

NGINX是一个免费的,开源的高性能HTTP服务器和反向代理,以及IMAP / POP3代理服务器。NGINX以其高性能,稳定性,丰富的功能集,简单的配置和低资源消耗而闻名。

2. 特性

2.1反向代理

有反向代理,就有正向代理,正向代理的典型例子就是vpn工具,例如 当访问谷歌的时候,发出的请求www.google.com的这个请求,会被vpn正向代理到代理服务器,再有代理服务器发送到谷歌服务器 如图示

反向代理如图示:

以上面正向代理的例子来说,如果www.google.com这个服务端有一个代理服务器地址是www.googleproxy.com 那么我们如果想要请求www.google.com其实应该访问的是www.googleproxy.com

理解:

正向代理和反向代理中的正向和反向针对的是客户端来说,正向代理指的是代理服务器配置在每一个客户端上,而反向代理针对客户端来说是只有一个的

对比

  1. 正向代理访问的地址就是真正的服务端地址,反向代理访问的是代理服务器的地址,即反向代理隐藏了真正服务器的地址
  1. 正向代理服务器每个客户端都有,反向代理是客户端只访问一个(此处不讨论代理服务器集群情况)

2.2 负载均衡

还是这个图为例,当服务端为多节点时,nginx可以提供负载均衡的功能,可以将客户端的请求根据某种规则分发到各个服务端节点上,减轻单节点的压力,nginx的上限与服务器性能有关系

2.3 动静分离

为了提高网站访问速度,可以将静态资源(html,js,img等) 放在单独的静态资源服务器中,而动态资源(jsp,servlet等)放在动态资源服务器中,提高服务器解析速度

2.4 热部署

nginx几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够不间断服务的情况下进行软件版本的升级

2.安装使用

nginx.org/en/download…

window下直接下载解压

源码编译安装

下载nginx-1.18.0.tar.gz后,上传至linux,再安装以下三个依赖

  1. 安装gcc
yum install gcc -y
  1. 安装 pcre-devel
yum install pcre-devel -y
  1. 安装zlib
yum install zlib-devel -y

编译

make && make install

启动

/usr/local/nginx/sbin/nginx

查询是否启动成功

ps -ef | grep nginx

也可以直接访问 ip地址查看是否跳转到nginx欢迎页面(nginx默认配置监听http 80端口)

如果使用linux系统,需要开放80端口,linux默认防火墙没有开放80端口

查看防火墙开放端口

firewall-cmd --list-ports

增加开放端口 注意80/tcp前不要有空格

firewall-cmd --zone=public --add-port=80/tcp --permanent

关闭开放端口

firewall-cmd --zone=public --remove-port=80/tcp --permanent

开放/关闭端口后,需重启生效

firewall-cmd --reload

2.1 常用命令

2.1.1 windows

#启动
start nginx
#停止
nginx -s stop
#重启
nginx -s reload

2.1.2 linux

配置环境变量 或者进入/usr/local/nginx/sbin/ 目录执行命令

#查看版本
./nginx -v
#启动
./nginx
#停止
./nginx -s stop
#重载
./nginx -s reload

3.配置文件

3.1 配置文件的组成

3.1.1 全局块

配置nginx服务器整体允许的指令,主要包括配置允许Nginx服务器的用户(组),允许生成的 woker process数,进程pid存放路径,日志存放路径和类型以及配置文件的引入等

worker_processes  1; 配置nginx的并发数,越大并发越高(收到服务器硬件限制)

3.1.2 event块

主要配置nginx服务器与用户的网络连接

events {
    worker_connections  1024;
}

指定每个work_connections的最大连接数 指定为1024

3.1.3 http块

http块是nginx中配置最频繁的地方,主要功能配置也是在这里配置,如反向代理,负载均衡等功能都是在http块中配置

http块主要还分为两块 http全局块和server块

3.1.3.1 http全局块

包括文件引入,MIME-TYPE定义,日志自定义,连接超时时间,单连接请求上限等

include       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  logs/access.log  main;

sendfile        on;
#tcp_nopush     on;

#keepalive_timeout  0;
keepalive_timeout  65;

#gzip  on;

3.1.3.2 server块

每一个server可以看作是一个虚拟主机

每个server块分为server全局块和location

3.1.3.2.1 server全局块
listen       80;
server_name  localhost;

#charset koi8-r;

#access_log  logs/host.access.log  main;
3.1.3.2.2 location
 location / {
            root   html;
            index  index.html index.htm;
        }

根据正则表达式判断转发的路径

3.2 反向代理配置

3.2.1 反向代理配置1 实现转发

实现效果,访问www.123.com/ 转发到linux服务器上的tomcat欢迎页面

3.2.1.1 安装tomcat

  1. tomcat.apache.org/download-80…
  1. 上传至虚拟机
tar -zvxf  apache-tomcat-8.5.58.tar.gz
  1. 进入解压目录启动
cd bin
./startup.sh
  1. 开放防火墙8080端口
firewall-cmd --add-port=8080/tcp --permannet
firewall-cmd --reload
  1. 访问 http://192.168.164.210:8080

3.2.1.2 配置域名映射

将www.123.com映射到192.168.164.210:80 上

修改C:\Windows\System32\drivers\etc\hosts文件

增加一行

192.168.164.210 www.123.com

3.2.1.3 修改nginx配置

当完成第二部就可以通过www.123.com:80访问到nginx的欢迎页面了

所以需要配置nginx,将访问www.123.com的请求反向代理到tomcat的8080端口上

修改nginx.conf配置

server {
    listen       80;
    server_name  192.168.164.210;

    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    location / {
        proxy_pass http://127.0.0.1:8080/;
        root   html;
        index  index.html index.htm;
    }

主要是修改server_name,location中增加proxy_pass 表示将192.168.164.210:80端口的请求都转发到127.0.0.1:8080上,也就是tomcat上

3.2.2 反向代理配置2 实现uri动态转发

实现效果:

访问http://192.168.164.210:9001/edu/转发到8081端口

访问http://192.168.164.210:9001/vod/转发到8080端口

3.2.2.1 准备工作

配置两个tomcat,修改端口,一个端口是8080 一个端口是8081

新增一个页面,放到两个tomcat下的webapps目录下(区分是否转发成功)

3.2.2.2 配置nginx

server{
		listen 9001;
		server_name 192.168.164.210;
		location ~ /vod/ {
			proxy_pass http://127.0.0.1:8080;
		}
		
		location ~ /edu/ {
			proxy_pass http://127.0.0.1:8081;
		}
	}

~ 表示使用正则表达式

遇到的一个错误

当使用了正则表达式之后,proxy_pass 里不能再出现uri

3.3 负载均衡配置

3.3.1 简单demo

实现目标: 将http://192.168.164.210:9001/edu/a.html 转发到 8080 和 8081 两台tomcat处理

http块增加如下

	upstream myserver{
		server 192.168.164.210:8080;
		server 192.168.164.210:8081;
	}

server块中的location块修改proxy_pass 转发到 上面的upstream

location / {
			proxy_pass http://myserver;
            root   html;
            index  index.html index.htm;
        }

3.3.2 负载均衡策略

3.3.2.1 轮询

默认策略 一个服务器访问一次

3.3.2.2 权重

upstream myserver{
		server 192.168.164.210:8080 weight=10;
		server 192.168.164.210:8081 weight=20;
	}

转发到8080的请求会比转发到8081的少一杯

计算方式是 10 / (10+20)

3.3.2.3 ip_hash

会根据ip来决定下一次转发到的服务器

如果第一次转发到8080,那么当前ip客户端之后的所有请求都会分发的8080处理;

3.3.2.4 fair

第三方模块 需要安装

根据服务器的响应时间来选择,响应时间越短,越容易被转发

3.3.2.5 url_hash

第三方模块 需要安装

根据访问的url来决定下一次转发到的服务器

如果第一次转发到8080,那么之后这个请求会被一直转发到8080

3.4 动静分离配置

动静分离指的是将动态请求和静态请求分离开,通过nginx将动态请求转发到动态请求服务器上(例如tomcat) 将静态请求转发到静态资源服务器上

主要的实现方式有两种

  1. 将静态资源部署到单独的静态资源服务器上,通过nginx转发到对应的服务器
  1. 将静态资源与动态资源混合发布,通过nginx区分不同的请求,再进行转发

3.4.1 配置demo

 server {
        listen       80;
        server_name  192.168.164.210;

        charset utf-8;

        #access_log  logs/host.access.log  main;

        location / {
			proxy_pass http://myserver;
            root   html;
            index  index.html index.htm;
        }
		location /www/ {
			root /data/;
			index index.html index.htm;
        }
		location /image/ {
			root /data/;
			autoindex on;
			index index.html index.htm;
        }

主要就是修改了location块下,root目录,将对应location的请求转发到对应的目录下

autoindex 开启一个列表

3.4.2 autoinde中文乱码问题

修改server块 charset 为utf-8

4.集群

建立主备服务器

使用keepalived 虚拟ip 完成主备服务器

5.原理

模型是 master + worker

当请求进入,首先先到master.再由master分发给worker