如果Linux系统中没有安装wget,需要先行安装
安装后的目录
====================================================================
静态服务器
通过浏览器进行访问
案例二:
1、 在/usr/local/var/www下分别创建images和img目录,分别在每个目录下放一张test.jpg;
2、配置文件中
http {
server {
listen 80;
server_name localhost;
set $doc_root /usr/local/var/www; # 设置自定义变量
# 默认location
location / {
root /usr/local/var/www/html;
index index.html index.htm;
}
location ^~ /images/ { # ^~ 前缀匹配,如果匹配成功则不再
root $doc_root;
}
location ~* \.(gif|jpg|jpeg|png|bmp|ico|swf|css|js)$ { # ~* 表示执行一个正则匹配,不区分大小写
root $doc_root/img;
}
}
}
location优先级
当一个路径匹配多个location时究竟哪个location能匹配到时有优先级顺序的,而优先级的顺序于location值的表达式类型有关,和在配置文件中的先后顺序无关。相同类型的表达式,字符串长的会优先匹配。
location = / {
# 精确匹配/,主机名后面不能带任何字符串 /
[ configuration A ]
}
location / {
# 匹配所有以 / 开头的请求。
# 但是如果有更长的同类型的表达式,则选择更长的表达式。
# 如果有正则表达式可以匹配,则优先匹配正则表达式。
[ configuration B ]
}
location /documents/ {
# 匹配所有以 /documents/ 开头的请求,匹配符合以后,还要继续往下搜索。
# 但是如果有更长的同类型的表达式,则选择更长的表达式。
# 如果有正则表达式可以匹配,则优先匹配正则表达式。
[ configuration C ]
}
location ^~ /images/ {
# 匹配所有以 /images/ 开头的表达式,如果匹配成功,则停止匹配查找,停止搜索。
# 所以,即便有符合的正则表达式location,也不会被使用
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
# 匹配所有以 gif jpg jpeg结尾的请求。
# 但是 以 /images/开头的请求,将使用 Configuration D,D具有更高的优先级
[ configuration E ]
}
location /images/ {
# 字符匹配到 /images/,还会继续往下搜索
[ configuration F ]
}
location = /test.htm {
root /usr/local/var/www/htm;
index index.htm;
}
# 注意:location的优先级与location配置的位置无关
多端口访问
①、nginx.conf进行配置
server{
listen 9001;
server_name localhost;
location ~ /hosp/{
proxy_pass http://localhost:8201
}
location ~ /cmn/{
proxy_pass http://localhost:8202
}
}
执行nginx.exe启动window版本的nginx
②、前端config目录下打的dev.env.js文件中
分别进行访问
负载均衡
负载均衡
增加服务器的数量,将请求分发到各个服务器上面。
客户端(15个请求)—>反向代理服务器—>服务器(3台)
Nginx目前支持自带3种负载均衡策略,还有2种常用的第三方策略
upstream web_servers {
server localhost:8081;
server localhost:8082;
}
server {
listen 80;
server_name localhost;
access_log logs/host.access.log main;
location / {
proxy_pass http://web_servers;
必须指定Header Host
proxy_set_header Host $host:$server_port;
}
}
默认是轮询方式,可以更改为权重方式
服务器性能差点就少接收点请求,服务器性能好点就多处理点请求
请求只有一次被分配到8081上,其他3次分配到8082上。backup是指热备,只有当8081和8082都宕机的情况下才走8083
upstream test {
server localhost:8081 weight=1;
server localhost:8082 weight=3;
server localhost:8083 weight=4 backup;
}
ip_hash
上面的2种方式都有一个问题,那就是下一个请求来的时候请求可能分发到另外一个服务器,当我们的程序不是无状态的时候(采用了session保存数据),这时候就有一个很大的很问题了.
比如把登录信息保存到了session中,那么跳转到另外一台服务器的时候就需要重新登录了,所以很多时候我们需要一个客户只访问一个服务器,那么就需要用iphash了,iphash的每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
upstream test {
ip_hash;
server localhost:8080;
server localhost:8081;
}
fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。这个配置是为了更快的给用户响应
upstream backend {
fair;
server localhost:8080;
server localhost:8081;
}
url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法。
upstream backend {
hash $request_uri;
hash_method crc32;
server localhost:8080;
server localhost:8081;
}
反向代理
正向代理:
客户端(需要配置代理服务器)—>局域网—>Internet
客户若访问局域网外部的Internet,需要通过局域网的代理服务器进行
反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
简单来说就是真实的服务器不能直接被外部网络访问,所以需要一台代理服务器,而代理服务器能被外部网络访问的同时又跟真实服务器在同一个网络环境,当然也可能是同一台服务器,端口不同而已。
反向代理通过proxy_pass指令来实现
客户端--->反向代理服务器---->目标服务器
客户端不需要任何配置,只需要将请求发送给反向代理服务器
对外暴露的是代理服务器,而隐藏真实的目标服务器
当我们访问localhost的时候,就相当于访问 localhost:8081了
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://localhost:8081;
proxy_set_header Host $host:$server_port;
设置用户ip地址
proxy_set_header X-Forwarded-For $remote_addr;
当请求服务器出错去寻找其他服务器
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
}
}
- 为了加快网站速度,将动态页面和静态页面分开放到不同的服务器
upstream web_servers {
server localhost:8081;
server localhost:8082;
}
server {
listen 80;
server_name localhost;
set $doc_root /usr/local/var/www;
location ~* \.(gif|jpg|jpeg|png|bmp|ico|swf|css|js)$ {
root $doc_root/img;
}
location / {
proxy_pass http://web_servers;
必须指定Header Host
proxy_set_header Host $host:$server_port;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root $doc_root;
}
}
==============================================
nginx常用的命令:
必须进入nginx目录中使用命令 /usr/local/nginx/sbin
nginx配置文件:
主要有三部分构成:全局块+event块+http块
全局块:配置运行nginx服务器的用户(组)、允许生成的worker process数,进程PID存放路径、日志存放路径和类型以及配置文件的引入等
event块:nginx服务器与用户网络的连接
http块:配置最频繁的部分,代理、缓存、日志等第三方模块绑定
docker容器中的配置文件中位置:etc/nginx/
==================
配置nginx反向代理
浏览器www.123.com —> 跳转linux系统的tomcat主页
对于windows浏览器需要通过本地的host文件找到 配置域名映射的ip,若没有则通过网络上的DNS进行匹配
docker run --name my_tomcat -it -d -p 8080:8080 tomcat 启动tomcat
docker run -p 80:80 -d nginx 启动nginx
docker exec -it 469bfd0dc27a /bin/bash 进入容器内部
第一步:C:\Windows\System32\drivers\etc 找到host文件
如下配置后,可以直接通过域名www.123.com访问到指定的页面
第二步:在nginx进行反向代理配置
进入容器内部修改配置文件如下(系统下必须安装:apt install vim):docker exec -it c1ea5ab43c78 /bin/bash
修改etc/nginx目录下的nginx.conf
若出现 command not found
则使用以下命令:
apt-get update
apt-get install -y vim
nginx -t 查看是否修改成功
然后重新运行容器:
docker stop c1ea5ab43c78
docker restart c1ea5ab43c78
docker rm -f 1e560fca3906 删除容器
根据客户端的不同请求路径,通过nginx进行判断,从而跳转到不同的服务器
-
准备两个tomcat服务器,端口分别为8080,8081
通过tomcat根目录下的conf中server.xml修改端口
-
在tomcat中的webapps目录下创建一个文件夹edu,并放入a.html
在另一个webapps以同样的方式创建vod,并放入a.html
通过浏览器进行访问http://ip:端口号/edu/a.html或者http://ip:端口号/vod/a.html -
在nginx配置文件中,进行反向代理
-
开放防火墙端口号,并重新启动nginx
关于nginx配置文件中location中的注意事项:
====================================
配置负载均衡
在nginx的配置文件中实现负载均衡的配置
效果是:每次请求都会跳转到不同的服务器
对于负载均衡的分配方式,有以下集中策略:
- 轮询,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,自动剔除
- weight,权重默认1,权重越高被分配的客户端越多
- ip_hash 方式
每个请求按访问的ip的hash结果分配,每个访客固定访问一个后端服务器,可以解决session的问题。第一次访问的服务器就决定了后续访问的依然是该服务器
- fair(第三方)
按照请求的服务响应时间来分配,响应时间短的优先分配
=======================
动静分离
把动态去请求和静态请求分开,而不是单纯的把静态页面和动态页面物理分离
可以理解为:使用Nginx处理静态页面,Tomcat处理动态页面
大致分为两种来实现动静分离:
-
纯粹把静态文件独立成单独的域名放在静态服务器上
-
动态和静态文件混在一起,通过nginx来分开
过程:
在data目录下,分别创建两个目录image(01.jpg)、 www(a.html)
通过nginx配置访问
最终浏览器访问方式:
配置文件中的autoindex on; 列出文件夹中的内容
=======================
高可用:
如果nginx宕机,但请求过程仍然可用
对外提供一个虚拟的ip:192.168.17.50 进行绑定
需要两台linux环境nginx服务器,并安装好keepalived
安装后在etc中keepalived中的配置文件中进行配置
keepalived.conf文件中进行高可用配置
指定主、备机,并指定脚本文件(检测nginx是否活着)
======================
高可用配置信息keepalived.conf
全局配置
检测脚本配置
虚拟ip配置
全局配置中,配置访问到的主机名(先通过vi /etc/host 进行设定)
检测脚本配置(脚本中的条件成立,执行间隔操作,权重)
虚拟ip的配置
脚本
=================
Nginx原理
nginx启动后有两个进程:master、worker
worker如何进行工作?
一个master,多个worker的好处:
可以使用nginx -s reload热部署
每个worker独立进程
worker数量和CPU核数相等最合适
worker的连接数
发送请求,占用了worker几个连接数(2个或4个)
客户端—>nginx—>静态资源(2个)
客户端—>nginx—>tomcat(4个)
nginx有一个master,四个worker,每个worker支持最大的连接数据是1024,支持最大的并发数是多少
1024X4/2
公式如下:
Nginx代理MySQL连接,并限制访问IP
生产环境基本上都部署在云服务器上,例如应用服务器、MySQL服务器等。如果MySQL服务器直接暴露在公网,就会存在很大的风险,为了保证数据安全,MySQL服务器的端口是不对外开放的。
线上业务遇到bug了,开发的小伙伴需要远程连接MySQL来查看数据,那应该怎么办呢?
我们可以通过Nginx代理(“跳板机”)来进行连接。
环境准备:
需要一台服务器并安装Nginx,且与MySQL服务器处于一个内网之中,内网之间可以访问。
需要用到ngx_stream_core_module模块,该模块不是默认构建的,我们需要在configure时添加–with-stream来进行构建
根据其提供的指令,进行配置。
①、stream
该指令定义了stream服务器。与http块平级,定义在main块中
作用域:main
语法:stream {…}
stream {
server {
......
}
}
②、server
该指令定义一个虚拟主机,与http块中的server类似。我们可以在stream块中定义多个server块。
作用域:stream
语法:server {…}
stream {
server {
......
}
server {
......
}
}
③、listen
该指令定义虚拟主机server要监听的socket的地址和端口。
作用域:server
语法:listen address:port;
listen 127.0.0.1:3306;
listen *:3306;
# 效果与listen *:3306一样
listen 3306;
listen localhost:3306;
④、配置示例
MySQL服务器,端口3306(单机环境)
stream {
server {
listen 3306;
proxy_pass 192.168.110.101:3306;
}
}
MySQL服务器,端口3306(集群环境)
stream {
upstream mysql_socket {
server 192.168.110.101:3306;
}
server {
listen 3306;
proxy_pass mysql_socket;
}
}
此时,我们就可以通过例如Navicat等客户端进行连接。
限制访问IP
实现了对连接的代理,所有人都可以通过访问Nginx来连接MySQL服务器,解决了外网无法连接的问题。
为了更进一步的缩小访问范围,保证数据安全,我们可以限制只有公司网络的IP地址可以通过Nginx进行连接。
Nginx提供了ngx_stream_access_module模块,其指令非常简单,仅包含allow和deny指令。
①、allow
该指令设置指定的IP允许访问。可以和deny指令配合使用
作用域:stream, server
语法:allow address | CIDR | unix: | all;
# 允许192.168.110.1访问
allow 192.168.110.1;
# 允许192.168.110.1到192.168.255.254
allow 192.168.110.0/16;
# 允许192.168.110.1到192.168.110.254
allow 192.168.110.0/24;
# 允许所有的IP访问
allow all;
②、deny
该指令设置指定的IP禁止访问。可以和allow指令配合使用。
作用域:stream, server
语法:deny address | CIDR | unix: | all;
# 禁止192.168.110.1访问
deny 192.168.110.1;
# 禁止192.168.110.1到192.168.255.254
deny 192.168.110.0/16;
# 禁止192.168.110.1到192.168.110.254
deny 192.168.110.0/24;
# 禁止所有的IP访问
deny all;
禁止所有的IP访问,192.168.110.100除外。
Tips:如果指定了allow,需要配合deny使用,否则就是允许所有的IP地址访问。
allow 192.168.110.100;
deny all;
案例
只允许192.168.110.100通过Nginx连接MySQL服务器。
stream {
allow 192.168.110.100;
deny all;
server {
listen 3306;
proxy_pass 192.168.110.101:3306;
}
}
==============================================
视化配置 Nginx 的神器
支持什么功能的配置:反向代理、HTTPS、HTTP/2、IPv6, 缓存、WordPress、CDN、Node.js 支持、 Python (Django) 服务器等
想在线进行配置,只需要打开网站:https://nginxconfig.io/,按照自己的需求进行操作就行了
选择你的场景,填写好参数,系统就会自动生成配置文件。