一、nginx简介
1,什么是nginx
Nginx 是⼀款⾼性能的 http 服务器/反向代理服务器及电⼦邮件(IMAP/POP3)代理服务器。由俄罗斯的程序设计师伊⼽尔·⻄索夫(Igor Sysoev)所开发,官⽅测试 nginx 能够⽀撑 5 万并发链接,并且cpu、内存等资源消耗却⾮常低,运⾏⾮常稳定。
2,nginx应用场景
- http 服务器:Nginx 是⼀个 http 服务可以独⽴提供 http 服务。可以做⽹⻚静态服务器。
- 虚拟主机:可以实现在⼀台服务器虚拟出多个⽹站。例如个⼈⽹站使⽤的虚拟主机。
- 反向代理,负载均衡:当⽹站的访问量达到⼀定程度后,单台服务器不能满⾜⽤户的请求时,需要⽤多台服务器集群可以使⽤ nginx 做反向代理。并且多台服务器可以平均分担负载,不会因为某台服务器负载⾼宕机⽽某台服务器闲置的情况。
3,docker安装nginx
1,搜索nginx镜像
docker search nginx
2,拉取nginx镜像
docker pull nginx
3,创建数据卷
创建数据卷来存放nginx容器中的相关数据,这里我将数据放到/root/nginx下,在该目录下,有以下四个目录:conf、conf.d、html、logs
其中conf中存放主配置文件,conf.d中存放子配置文件,html中存放静态资源文件,logs中存放日志文件。
接着在conf目录下创建主配置文件nginx.conf,粘贴下⾯内容:
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
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;
}
4,创建并启动nginx容器
在nginx目录下执行以下命令:
docker run -id --name=c_nginx \
-p 80:80 \
-p 81:81 \
-p 82:82 \
-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \
-v $PWD/conf.d:/etc/nginx/conf.d \
-v $PWD/logs:/var/log/nginx \
-v $PWD/html:/usr/share/nginx/html \
nginx
参数说明:
- 冒号":“左边的代表的是宿主机的属性,冒号”:"右边的代表的是容器的属性
- -p : 将容器上的指定端口映射到宿主机上的指定端口
- -v : 将数据卷或其中的文件挂载到容器中指定的目录或文件上
二、nginx的使用
1,静态网站的部署
将静态资源(html页面)放到数据卷的html目录下或者放到nginx容器的/usr/share/nginx/html下即可;使用外部机器访问,默认端口是80
2,虚拟主机
所谓的nginx虚拟主机是指一个nginx容器可以提供多个端口,并且不同的端口可以对应不同的访问域名,同时对应不同的访问路径;例如在数据卷目录conf.d下添加一个子配置文件test.conf,如下:
server {
listen 81;
server_name www.xzk.com;
location / {
root /usr/share/nginx/cart;
index cart.html;
}
}
server {
listen 82;
server_name regist.xzk.com;
location / {
root /usr/share/nginx/search;
index search.html;
}
}
将两个静态资源目录cart和search放到容器的/usr/share/nginx/下,通过该配置文件,nginx容器提供了81和82两个端口,前面创建容器时配置好了端口映射,外部机器可以通过81、82端口进行访问。当客户端访问http://www.xzk.com:81/时,会访问到cart.html;当客户端访问http://regist.xzk.com:82/时,会访问到search.html;如此一来,便可以通过一个nginx容器来模拟多个网站。
注意:
- 基于端口的虚拟主机和基于域名的虚拟主机提供服务的是同一个IP,也就是nginx容器所在宿主机的IP
- 配置基于域名的虚拟主机时必须保证域名可用
- 另外,也可以配置基于IP的虚拟主机,使用较少,这里不再介绍
3,反向代理
1,什么是反向代理
参考这篇文章什么是反向代理
2,配置反向代理
目标:通过nginx来代理tomcat中部署的一个项目
首先,在linux上启动一个tomcat容器,映射宿主机端口号8080,tomcat容器中有一个test项目,test项目中有一个index.html文件
接着,修改数据卷conf.d目录下的子配置文件,如下:
upstream tomcat{ #声明一个目标服务
server 192.168.1.129:8080; #声明目标服务的地址
}
server {
listen 80; # 监听的端口
server_name localhost; # 域名或ip
location / { # 访问路径配置
root /usr/share/nginx/html;# 根目录
index index.html index.htm; # 默认首页
}
error_page 500 502 503 504 /50x.html; # 错误页面
location = /50x.html {
root html;
}
}
server {
listen 81; # 监听的端口
server_name www.abc.com; # 域名或ip
location / { # 访问路径配置
# root /usr/share/nginx/html;# 根目录
# index index.html index.htm; # 默认首页
proxy_pass http://tomcat; #代理地址
}
}
当客户端访问http://www.abc.com:81/tset时;nginx服务器会访问http://192.168.1.129:8080/test,然后将响应的结果返回给客户端,如下:
4,负载均衡
通过nginx代理访问目标服务时,默认采用轮询的方式进行负载均衡。启动三个tomcat容器,分别映射端口8080、8081、8082,修改上述配置文件,如下:
upstream tomcat{ #声明一个目标服务
server 192.168.1.129:8080; #声明目标服务的地址
server 192.168.1.129:8081;
server 192.168.1.129:8082;
}
server {
listen 80; # 监听的端口
server_name localhost; # 域名或ip
location / { # 访问路径配置
root /usr/share/nginx/html;# 根目录
index index.html index.htm; # 默认首页
}
error_page 500 502 503 504 /50x.html; # 错误页面
location = /50x.html {
root html;
}
}
server {
listen 81; # 监听的端口
server_name www.abc.com; # 域名或ip
location / { # 访问路径配置
# root /usr/share/nginx/html;# 根目录
# index index.html index.htm; # 默认首页
proxy_pass http://tomcat; #代理地址
}
}
当客户端访问http://www.abc.com:81/tset时,nginx代理会轮询的去访问三个目标服务地址;如果其中⼀台服务器性能⽐较好,想让其承担更多的压⼒,可以设置权重。如下:
upstream tomcat{ #声明一个目标服务
server 192.168.1.129:8080; #声明目标服务的地址
server 192.168.1.129:8081 weight=2;
server 192.168.1.129:8082;
}
则端口为8081的服务器的访问次数是其他服务器的2倍。
5,跨域配置
在前后端分离项目中会遇到跨域问题,其中后端一般是nginx接网关,可以在nginx处进行跨域配置。
nginx配置跨域,一般在响应头中加入如下4个请求头即可完美解决:
// 这个为请求头中的 origin
add_header 'Access-Control-Allow-Origin' '$http_origin' ;
add_header 'Access-Control-Allow-Credentials' 'true' ;
add_header 'Access-Control-Allow-Methods' 'PUT,POST,GET,DELETE,OPTIONS' ;
add_header 'Access-Control-Allow-Headers' 'Content-Type,Content-Length,Authorization,Accept,X-Requested-With' ;
nginx 配置跨域,可以为全局配置和单个代理配置(两者不能同时配置)
- 全局配置;在主配置文件下
http {
# 跨域配置
add_header 'Access-Control-Allow-Origin' '$http_origin' ;
add_header 'Access-Control-Allow-Credentials' 'true' ;
add_header 'Access-Control-Allow-Methods' 'PUT,POST,GET,DELETE,OPTIONS' ;
add_header 'Access-Control-Allow-Headers' 'Content-Type,Content-Length,Authorization,Accept,X-Requested-With' ;
- 局部配置(单个代理配置跨域), 在路径匹配符中加入跨域信息;在子配置文件下
upstream tomcat{ #声明一个目标服务
server 192.168.1.129:8080; #声明目标服务的地址
server 192.168.1.129:8081;
server 192.168.1.129:8082;
}
server {
listen 80; # 监听的端口
server_name localhost; # 域名或ip
location / { # 访问路径配置
root /usr/share/nginx/html;# 根目录
index index.html index.htm; # 默认首页
}
error_page 500 502 503 504 /50x.html; # 错误页面
location = /50x.html {
root html;
}
}
server {
listen 81; # 监听的端口
server_name www.abc.com; # 域名或ip
location / { # 访问路径配置
# 这里配置单个代理跨域,跨域配置
add_header 'Access-Control-Allow-Origin' '$http_origin' ;
add_header 'Access-Control-Allow-Credentials' 'true' ;
add_header 'Access-Control-Allow-Methods' 'PUT,POST,GET,DELETE,OPTIONS' ;
add_header 'Access-Control-Allow-Headers' 'Content-Type,Content-Length,Authorization,Accept,X-Requested-With' ;
# root /usr/share/nginx/html;# 根目录
# index index.html index.htm; # 默认首页
proxy_pass http://tomcat; #代理地址
}
}
`