目录

Nginx是什么?

Nginx是干什么用的?

为什么用Nginx?

如何使用Nginx?

1、下载安装及启用

(1) nginx官网下载

(2) 上传解压

(3) 安装nginx

2、常见用法

(1) 反向代理 

(2) 负载均衡

(3) 解决跨域问题

(4) 设置缓存

(5)其他常见问题

结语:


Nginx是什么?

Nginx是一个轻量级、高性能的反向代理Web服务器,由于使用C语音写的,所以它速度非常快,性能也很优秀。主要功能就是反向代理、负载均衡、解决跨域、实现缓存、限流、动静资源分离、配置SSL证书等。它不是一台真正意义上的物理机服务器,并不是真实存在的实体,而是运行在某一台(电脑)服务器上的软件。

Nginx是干什么用的?

当我们的(电脑)服务器上安装了Nginx这个软件,通过一些简单的配置并运行这个软件,我们在服务器上运行的项目(例如Java程序)在接收Http请求的时候,这个请求就会被Nginx这个网关先拦截,经过一些上述的处理之后再交给后端程序处理,可以理解为Nginx是一台Web服务器。

为什么用Nginx?

Nginx可以跨平台,配置简单。我们可以在Linux系统和windows系统上都开启Nginx服务,在linux上,我们通常只需要修改三四行代码,既可以完成对项目的配置。当后端程序重构或者重新部署,例如由php项目换成java项目,也不需要修改Nginx。

nginx转发一个服务器的前端 nginx转发到另一台nginx_Nginx

一般的前后端分离项目,用户获取前端静态资源文件,都得先经过后端程序的接口再获取服务器上的静态资源文件,这样的效率并不是特别高,而且会占用正常程序接口的连接数量,这时候Nginx的动静资源分离功能就提供了很好的解决方法,一般静态资源文件都放在Nginx服务器中,当Nginx接收到了获取静态资源文件的请求,就直接在Nginx服务器中把放进去的静态资源返回了,而不用真正到达后端接口,这个效率是非常高的,比正常的访问速度会快一倍左右。

在并发量较大的项目中,后端往往会开启多个相同的服务,用来缓解单服务的压力,我们知道,每一个后端服务程序都会占用一个端口,那前端在后端接口的时候,怎么知道该选用哪个接口呢?这时就可以在所有的后端程序前放置一个Nginx程序,让所有的请求都先经过Nginx,然后由Nginx决定分发到哪个端口程序,这样虽然后端有很多个程序,但对于前端来说,是无感知的,就好像后台只有一个项目在跑一样。

如何使用Nginx?

1、下载安装及启用

(1) nginx官网下载

下载地址:https://nginx.org/en/download.html

(2) 上传解压

下载好压缩包,上传到linux服务器步骤省略;
解压命令:tar -xvf nginx-1.24.0.tar.gz   // 根据你下载的nginx版本及名称

(3) 安装nginx

进入nginx目录:cd nginx-1.24.0  // 对应nginx解压后的目录

安装依赖
#安装gcc,编译时依赖gcc环境yum install gcc-c++
yum install gcc-c++

#安装PCRE pcre-devel,提供nginx支持重写功能
yum install -y pcre pcre-devel

#安装zlib,zlib 库提供了很多压缩和解压缩的方式,nginx 使用 zlib 对 http 包内容进行 gzip 压缩
yum install -y zlib zlib-devel

#安装Open SSL,安全套接字层密码库,用于通信加密
yum install -y openssl openssl-devel

执行命令 ./configure 或者 ./configure --with-http_stub_status_module --with-http_ssl_module 安装ssl证书 添加两个模块

执行make命令:make
执行安装命令:make install

查看是否安装成功:ps -ef | grep nginx(看是否有nginx进程)

若安装成功,则会出现nginx进程

图片如下:

nginx转发一个服务器的前端 nginx转发到另一台nginx_Nginx_02

(4) 启动nginx及常用命令

查看是否启动成功:ps -ef | grep nginx
查看nginx的配置文件情况:nginx -t
查看nginx的版本:nginx -v

启动Nginx:
切到 /usr/local/nginx/sbin目录下,启动服务:./nginx 或根目录 /usr/local/nginx/sbin/nginx

重启Nginx:
切到/usr/local/nginx/sbin,重启服务:nginx -s reload 或 /usr/local/nginx/sbin/nginx -s reload

停止Nginx:
切到/usr/local/nginx/sbin,停止服务:nginx -s stop 或 /usr/local/nginx/sbin/nginx -s stop

2、常见用法

(1) 反向代理 

nginx反向代理通俗来讲就是网关和服务器是一伙的,用户端无法通过公网直接访问到后台服务器上的后端应用程序,但是可以直接访问nginx网关,再由nginx分发到不同的服务器(或者说应用程序)上,真正提供服务的服务器对于用户来说是无感知的,所有的请求都必须先发送到nginx网关上,再进行请求转发,用户端并不知道真正提供服务的服务器是谁,也不知道它的具体ip地址和端口,所以称之为反向代理。

nginx转发一个服务器的前端 nginx转发到另一台nginx_nginx转发一个服务器的前端_03

拿这张nginx配置来讲,listen监听的就是这个ip下的端口,server_name实际上就是本机的ip或域名,root为你需要设置的nginx根目录,“/”表示默认URL路径,location /testApi/ 表示当请求的URL以/testApi/开头时将会拦截拦截,proxy_pass则表示把这个拦截的url要转发到哪个服务器或端口上,所以填的是ip+端口。这样就可以做到反向代理,把某个ip+端口+路径的请求给拦截下来,转发到另一个ip+端口+路径的资源上。 

(2) 负载均衡

当一个项目足够大的时候,通常后端并不会只开启一个应用程序,一般会有多个,这时候就需要nginx来选择将所有的请求分发给不同的程序应用,这个过程就是负载均衡。

按轮询分配

http {
    # 请求转发分配
    upstream myApp {
        server myApp1.com;  # 接收分配的服务器列表,如ip、ip:端口号、域名、域名:端口号
        server myApp2:8080;
        server myApp3.com;
    }

    server {
        listen 80; # nginx监听的端口
        server_name localhost;

        location / {
        	# 使用myApp分配规则,即自定义添加的upstream节点
        	# 将所有请求转发到myApp服务器组中配置的某一台服务器上
            proxy_pass http://myApp; 
        }
    }
}

按权重分配

# 按权重转发分配
upstream myApp {
	server myApp1.com  weight=1; # 该台服务器接受1/6的请求量
	server myApp2:8080 weight=2; # 该台服务器接受2/6的请求量
	server myApp3.com  weight=3; # 该台服务器接受3/6的请求量;
}

连接数量最少的优先分配

# 优先分配给连接数量少的
upstream myApp {
	least_conn; # 把请求分派给连接数最少的服务器
	server server myApp1.com;
	server server myApp2.com:8080;
	server server myApp3.com;
}

按 ip hash 分配

# 按ip hash分配
upstream myApp {
	ip_hash; # #保证每个请求固定访问一个后端服务器
	server myApp.com;
	server myApp.com2:8088;
	server myApp.com3;
}
(3) 解决跨域问题
location / {  
    #允许跨域请求的域,* 代表所有
    add_header 'Access-Control-Allow-Origin' *;
    #允许请求的header
    add_header 'Access-Control-Allow-Headers' *;
    #允许带上cookie请求
    add_header 'Access-Control-Allow-Credentials' 'true';
    #允许请求的方法,比如 GET,POST,PUT,DELETE
    add_header 'Access-Control-Allow-Methods' *;
    if ($request_method = 'OPTIONS') {
        return 204;
    }
    proxy_pass http://myApp;
}
(4) 设置缓存
  • 修改 Nginx 配置文件,在 http 模块中,使用 proxy_cache_path 指令创建 keys zone,即创建一块共享内存空间,用于存储缓存数据的 active key;同时,指定一个目录,用于存储缓存的数据。
  • 在 http - server - location 模块中,使用 proxy_cache 指令,指定要使用的 keys zone。
  • 在 http - server - location 模块中,使用 proxy_cache_valid 指令,指定针对哪些返回码的响应做缓存,以及缓存多长时间。
http {
    proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;

# path:强制参数,指定缓存文件的存放路径。
# levels:定义了缓存目录的层级。每层可以用1(最多16种选择,0-f)或2(最多256种选择,00-ff)表示,中间用 : 分隔。
# keys_zone:强制参数,定义共享内存区的名称和大小,该共享内存用于保存缓存项目的元数据(所有活动的key和缓存数据相关的信息)# inactive:删除指定时间内未被访问的缓存文件,默认10分钟。
# max_size:设置了缓存存储的上限,如果不指定,最大会用掉所有磁盘空间。
# use_temp_path:直接把临时文件放在缓存目录中。
    
    # 请求转发分配
    upstream myApp {
        server myApp1.com;  # 接收分配的服务器列表,如ip、ip:端口号、域名、域名:端口号
        server myApp2:8080;
        server myApp3.com;
    }

    server {
        listen 80; # nginx监听的端口

        location / {
            # 指定用于页面缓存的共享内存,zone名称由proxy_cache_path指令定义
            proxy_cache my_cache;
            # 为不同的响应状态码设置不同的缓存时间,此为缓存状态码为200的请求,缓存时长为5分钟
            proxy_cache_valid 200 5m;
            # 指定缓存文件的key为请求的URI
            proxy_cache_key $request_uri;
            # 把缓存状态设置为头部信息,响应给客户端
            add_header Nginx-Cache-Status $upstream_cache_status
            
            # 设置代理转发的后端服务器的协议和地址
        	# 使用myApp分配规则,即自定义添加的upstream节点 
        	# 将所有请求转发到myApp服务器组中配置的某一台服务器上
            proxy_pass http://myApp; 
        }
    }
}
(5)其他常见问题

HTTP协议默认使用的端口是80,HTTPS协议默认使用的端口是443,这是因为在早期互联网的设计中,为了方便,HTTP和HTTPS协议的默认端口就是这两个端口。一般来说,在浏览器访问网站时,如果没有指定端口号,浏览器会默认使用HTTP协议的80端口或HTTPS协议的443端口进行连接。因此,在设置域名默认端口时,应该考虑使用这两个默认端口之一,以便用户可以直接通过域名访问网站,而不需要手动输入端口号。

但是我们一个服务器上可能有多个域名都绑定了这个服务器的ip,每个域名都是一个独立的网站,而且服务器上可能有很多个后端应用服务,而端口(80)只有一个,那这么多网站和服务怎么公用一个端口呢?没错,还是靠nginx,我们只需要配置多个server即可,多个server都监听80端口,再根据域名的不同将请求转发到不同的端口即可。

监听www.myApp1.com域名的80端口,并转发到8080端口

server {
        listen 80; # nginx监听的端口
        server_name www.myApp1.com

        root   /data/zhangtest/H5game;

        location / {
            index  index.html index.htm;

            add_header Access-Control-Allow-Origin *;
            add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
            add_header Access-Control-Allow-Headers *;

        	# 将所有请求转发到myApp服务器组中配置的某一台服务器上
            proxy_pass http://myApp:8080/; 
        }
    }

监听www.myApp2.com域名的80端口,并转发到8081端口

server {
        listen 80; # nginx监听的端口
        server_name www.myApp2.com

        root   /data/zhangtest/H5game;

        location / {
            index  index.html index.htm;

            add_header Access-Control-Allow-Origin *;
            add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
            add_header Access-Control-Allow-Headers *;

        	# 将所有请求转发到myApp服务器组中配置的某一台服务器上
            proxy_pass http://myApp:8081/; 
        }
    }

结语:

纸上得来终觉浅,绝知此事要躬行。多说无益,小手赶快动起来吧!