一篇文章带你快速上手Nginx,一款高性能的反向代理web服务器!
纸上得来终觉浅,绝知此事要躬行。多说无益,小手赶快动起来吧!
目录
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?
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进程
图片如下:
(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配置来讲,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/;
}
}
结语:
纸上得来终觉浅,绝知此事要躬行。多说无益,小手赶快动起来吧!
更多推荐
所有评论(0)