Nginx 基本使用
# 何时用Nginx技术
nginx生成中常见用途
做web容器发布静态资源、做服务器做反向代理,进而实现服务器集群负载均衡、邮件代理服务器等等
解决生成中什么问题?
1、反向代理,让请求不用直面tomcat,而是让nginx请求转发到tomcat中。让用户直接访问反向代理服务器就可以获得目标服务器的资源,反向代理服务器负责将请求转发给目标服务器
2、实现服务器集群负载均衡,将资源部署到ABC三台服务器中集群(水平扩展),由nginx进行转发,就算我的A服务器挂掉了nignx也能访问其他BC服务器,避免了单点故障服务不可用
# Nginx安装流程
Nginx安装及应用.pdf (opens new window)
#
常用命令
以下命令都是配置了环境变量后才可直接执行,否则应去到Nginx的sbin目录下
| 功能 | 命令 | 描述 |
|---|---|---|
| 查看版本 | nginx -v | |
| 检查配置文件 | nginx -t | |
| 启动 | nginx | nginx服务启动后,默认就会有两个进程。 |
| 停止 | nginx -s stop | 查看nginx的进程 ps -ef|grep nginx |
| 重新加载 | nginx -s reload | 修改了Nginx配置文件后,需要重新加载才能生效 |
启动之后,我们可以直接访问Nginx的80端口, http:// (opens new window)IP地址 注意: 要想正常访问Nginx,需要关闭防火墙或开放指定端口号,执行的指令如下: A. 关闭防火墙 systemctl stop firewalld B. 开放80端口 firewall-cmd --zone=public --add-port=80/tcp --permanent firewall-cmd --reload
# Nginx应用部署静态资源、反向代理、负载均衡
# 配置文件结构
nginx的配置文件(conf/nginx.conf)整体上分为三部分: 全局块、events块、http块。这三块的分别配置什么样的信息呢,看下表:
| 区域 | 职责 |
|---|---|
| 全局块 | 配置和nginx运行相关的全局配置 |
| events块 | 配置和网络连接相关的配置 |
| http块 | 配置代理、缓存、日志记录、虚拟主机等配置 |
具体结构如下图:
参数:
worker_connections:一个进程可以支持连接的连接数量
在全局块、events块以及http块中,我们经常配置的是http块。 在http块中可以包含多个server块,每个server块可以配置多个location块。
所有配置信息都可以在nginx.conf中配置 如果忘记在哪里了可以使用whereis nginx.conf查看位置
# 部署静态资源
Nginx可以作为静态web服务器来部署静态资源。这里所说的静态资源是指在服务端真实存在,并且能够直接展示的一些文件,比如常见的html页面、css文件、js文件、图片、视频等资源。
相对于Tomcat,Nginx处理静态资源的能力更加高效,所以在生产环境下,一般都会将静态资源部署到Nginx中。
将静态资源部署到Nginx非常简单,只需要将文件复制到Nginx安装目录下的html目录中即可。
server {
listen 80; #监听端口
server_name localhost; #服务器名称
location / { #匹配客户端请求url
root html; #指定静态资源根目录
index index.html; #指定默认首页
}
}
2
3
4
5
6
7
8
示例
1、nginx默认访问的路径就是html目录下的,假设我有一个hello.html的页面,那么把它放到 /usr/local/nginx/html 目录下,启动nginx,访问http://192.168.200.200/hello.html即可。
2、如果要配置首页信息,可以修改location的index指令,**然后重新加载配置文件 **如下
# 反向代理
概念
1). 正向代理
正向代理服务器是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。
正向代理的典型用途是为在防火墙内的局域网客户端提供访问Internet的途径。
正向代理一般是在客户端设置代理服务器,通过代理服务器转发请求,最终访问到目标服务器。
2). 反向代理
反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源,反向代理服务器负责将请求转发给目标服务器。用户不需要知道目标服务器的地址,也无须在用户端作任何设定,对于用户来说,访问反向代理服务器是完全无感知的。
在nginx中,我们可以在nginx.conf中配置反向代理:
server {
listen 82;
server_name localhost;
location / {
proxy_pass http://192.168.78.128:8080; #反向代理配置,将请求转发到指定服务
}
}
2
3
4
5
6
7
上述配置的含义为: 当我们访问nginx的82端口时即http://192.168.200.200:82/,根据反向代理配置,会将请求转发到 http://192.168.78.128:8080 对应的服务上。
# 负载均衡
概念介绍
早期的网站流量和业务功能都比较简单,单台服务器就可以满足基本需求,但是随着互联网的发展,业务流量越来越大并且业务逻辑也越来越复杂,单台服务器的性能及单点故障问题就凸显出来了,因此需要多台服务器组成应用集群,进行性能的水平扩展以及避免单点故障出现。
**应用集群:**将同一应用部署到多台机器上,组成应用集群,接收负载均衡器分发的请求,进行业务处理并返回响应数据
**负载均衡器:**将用户请求根据对应的负载均衡算法分发到应用集群中的一台服务器进行处理
此处的负载均衡器,我们将会使用Nginx来实现,而Nginx的负载均衡是基于反向代理的,只不过此时所代理的服务器不是一台,而是多台。
在nginx中配置负载均衡
打开nginx的配置文件nginx.conf并增加如下配置:
#upstream指令可以定义一组服务器 给他们起个名字,名字自定义(一会要用)
upstream 名字{
server 192.168.78.128:8080;
server 192.168.78.128:8081;
}
server {
listen 9090;
server_name localhost;
location / {
proxy_pass http://刚才自定义名字;
}
}
2
3
4
5
6
7
8
9
10
11
12
13

重写加载Nginx配置文件后访问nginx的8080端口http://192.168.200.200:8080, 此时nginx会根据负载均衡策略,将请求转发到后面的两台服务器。
**注意: **上述所有涉及到的端口号,都需要在对应的服务器的防火墙中开放,或者彻底关闭防火墙
# 负载均衡策略
处理上述默认的轮询策略以外,在Nginx中还提供了其他的负载均衡策略,如下:
| 名称 | 说明 | 特点 |
|---|---|---|
| 轮询 | 默认方式 | |
| weight | 权重方式 | 根据权重分发请求,权重大的分配到请求的概率大 |
| ip_hash | 依据ip分配方式 | 根据客户端请求的IP地址计算hash值, 根据hash值来分发请求, 同一个IP发起的请求, 会发转发到同一个服务器上 |
| least_conn | 依据最少连接方式 | 哪个服务器当前处理的连接少, 请求优先转发到这台服务器 |
| url_hash | 依据url分配方式 | 根据客户端请求url的hash值,来分发请求, 同一个url请求, 会发转发到同一个服务器上 |
| fair | 依据响应时间方式 | 优先把请求分发给处理请求时间短的服务器 |
权重的配置:
#upstream指令可以定义一组服务器
upstream targetserver{
server 192.168.78.128:8080 weight=2;
server 192.168.78.128:8081 weight=1;
}
2
3
4
5
上述配置的weight权重是相对的,在上述的配置中,效果就是,在大数据量的请求下,最终8080接收的请求数是8081的两倍。
# 前后端分离配置示例
server {
listen 80;
listen [::]:80;
server_name localhost;
#access_log /var/log/nginx/host.access.log main;
# location / {
## root /usr/share/nginx/html;
## index index.html index.htm;
# proxy_pass http://192.168.3.6:8080; #反向代理配置,将请求转发到指定服务
# proxy_redirect default;
# }
location ^~ /api/ {
# 路径重写,将"/api/资源路径" 重写为"/资源路径"
# /$1 代表获取前面表达式中()里面的内容作为路径
rewrite ^/api/(.*)$ /$1 break;
proxy_pass http://192.168.3.6:10010;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# 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;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# docker运行
# 创建挂载目录
mkdir -p /root/nginx/conf
mkdir -p /root/nginx/log
mkdir -p /root/nginx/html
2
3
4
# 生成容器
docker run --name nginx -p 80:80 -d nginx
#将容器的配置复制到宿主机
docker cp nginx:/etc/nginx/ /usr/local/docker/nginx
docker cp nginx:/var/log/nginx/ /usr/local/docker/nginx/log
docker cp nginx:/usr/share/nginx/html/ /usr/local/docker/nginx
2
3
4
5
6
# 直接执行docker rm nginx或者以容器id方式关闭容器
# 找到nginx对应的容器id
docker ps -a
# 关闭该容器
docker stop nginx
# 删除该容器
docker rm nginx
# 删除正在运行的nginx容器
docker rm -f nginx
2
3
4
5
6
7
8
9
10
docker run \
-p 80:80 \
-p 10010:10010 \
--name nginx \
-v /usr/local/docker/nginx/conf:/etc/nginx \
-v /usr/local/docker/nginx/log:/var/log/nginx \
-v /usr/local/docker/nginx/html:/usr/share/nginx/html \
-d nginx:1.23.2
2
3
4
5
6
7
8