Nginx的简单操作
Nginx的介绍
Nginx是由俄罗斯人研发的,应对Rambler的网站并发,并且2004年发布的第一个版本Nginx
- 稳定性极强,7*24小时不间断运行(就是一直运行)
- Nginx提供了非常丰富的配置实例
- 占用内存小,并发能力强
Nginx的安装与启动
利用docker安装简单快捷,可直接docker pull nginx:TAG
或者是通过docker-compose来搭建nginx,执行docker-compose up -d默认再当前目录下查找docker-compose.yml并执行
version: '3.1'
services:
nginx: #表示服务是nginx
restart: always #表示docker启动时,容器是否自启
image: daocloud.io/library/nginx:latest #表示镜像
container_name: nginx #表示容器名称
ports: #指定端口号
- 80:80
运行成功后访问80端口看是否成功
Nginx的配置文件说明
容器内部cat /etc/nginx/nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
#events块之前的称之为全局快
#worker_processes的值越大说明其并发能力越强
#error_log 是其错误日志存储的位置
#pid是nginx运行的一个标识
events {
worker_connections 1024;
}
#events中的worker_connections的值越大说明并发能力越强
http {
include /etc/nginx/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 /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
# http块
# include表示引入一个外部的文件 --> /mime.types中存放着大量的媒体类型
# include /etc/nginx/conf.d/*.conf; --> 引入了conf.d目录下的以.conf为结尾的配置文件
# location块
# root:将接收到的请求根据/usr/share/nginx/html去查找静态资源
# index:默认去上述路径中找到index.html或index.htm
# server块
# listen: 代表Nginx监听的端口号
# localhost: 代表Nginx接收请求的ip
修改docker-cpmpose.yml
version: '3.1'
services:
nginx:
restart: always
image: daocloud.io/library/nginx:latest
container_name: nginx
ports:
- 80:80
volumes:
- /opt/docker_nginx/conf.d/:/etc/nginx/conf.d #添加容器卷
#数据卷映射之后,要在对应目录/opt/docker_nginx/conf.d下创建相应的.conf文件
修改完成后,进行以下操作
#重新构建容器
docker-compose bulid
#重新启动容器
docker-compose up -d
#重启nginx
docker-compose restart
Nginx的反向代理
正向代理和反向代理介绍
正向代理
- 正向代理服务由客户端设立的
- 客户端知道服务端与代理服务器是谁
- 提高访问速度,对服务端隐藏客户端ip
反向代理
- 反向代理和正向代理相反,由服务端设立
- 服务端知道客户端是谁而客户端不知道服务端是谁
- 达到负载均衡,对客户端隐藏服务端的真实ip
基于反向代理机制,我们可以用nginx给tomcat配置反向代理
修改default.conf文件
添加以下内容,展示页面
server {
listen 80; #监听的端口号
server_name localhost; #接受请求的ip
location / {
proxy_pass 192.168.193.128:8080/; #此处为linux宿主机的ip地址
}
}
重新启动容器docker-compose restart
再进入192.168.192.128:80就是Tomcat的首页了
关于Nginx的location路径映射
优先级关系:
(location = )>(location /xx/yy/zz)>(location ^~)>(location ,*)>(location /起始路径)>(location /)
# 1. = 匹配
location = / {
# 精准匹配,主机名后面不能带任何字符串
}
# 2. 通用匹配
location /xxx {
# 匹配所有以/xxx开头的路径
}
# 3. 正则匹配
location ~ /xxx {
# 匹配所有以/xxx开头的路径
}
# 4. 匹配开头路径
location ^~ /images/ {
# 匹配所有以/images开头的路径
}
# 5. ~* \.(gif|jpg)$ {
# 匹配以gif或jpg为结尾的路径
}
Nginx负载均衡
nginx 分配服务器策略
- 轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。
- weight:weight 代表权重默认为 1,权重越高被分配的客户端越多
- ip_hash:每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器
- fair(第三方):按后端服务器的响应时间来分配请求,响应时间短的优先分配。
轮询
在配置文件中添加以下内容
upstream 名字{
server ip:端口;
server 域名:端口;
}
server {
listen 80;
listen [::]:80;
server_name localhost;
location / {
proxy_pass http://upstream的名字/;
}
}
upstream 内部,把需要负载均衡的服务器都写上
重启容器使配置文件生效
weight权重
在配置服务器端口后写上weight=权重数
upstream 名字{
server ip:端口 weight=权重数;
server 域名:端口 weight=权重数;
}
server {
listen 80;
listen [::]:80;
server_name localhost;
location / {
proxy_pass http://upstream的名字/;
}
}
IPhash
实现iphash只要在upstream内容的上添加iphash即可
upstream 名字{
iphash
server ip:端口 权重数;
server 域名:端口 权重数;
}
server {
listen 80;
listen [::]:80;
server_name localhost;
location / {
proxy_pass http://upstream的名字/;
}
}
fair
在upstream后面加上fair
upstream 名字{
server ip:端口 权重数;
server 域名:端口 权重数;
fair
}
server {
listen 80;
listen [::]:80;
server_name localhost;
location / {
proxy_pass http://upstream的名字/;
}
}
动静分离
为什么要动静分离?
通过上述可知,寻找动态资源时需要有四个过程,而寻找静态资源只有俩个
Nginx的并发能力公式:
worker_processes * worker_connections / 4|2 = Nginx最终的并发能力
所以可以知道,如果采取动静分离能提高nginx的并发能力
动态资源代理
#配置如下
location / {
proxy_pass 路径; #利用proxy_pass指定转发路径为动态请求
}
静态资源代理
location / {
root /usr/share/nginx/html;
index index.html;
}
#配置如下
location / {
root 静态资源路径;
index 默认访问路径下的什么资源;
autoindex on;#代表展示静态资源的全部内容,以列表的形式展开
}
# 先修改docker,添加一个数据卷,映射到Nginx服务器的usr/share/nginx/html目录
# 在数据卷的路径下添加静态资源,如index.html或1.jpg
# 修改配置文件,再restart
这是我们再访问的时候匹配到对应的location则会进入到我们指定的静态文件