Nginx学习笔记(Docker版)-1
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx学习笔记(Docker版)-1相关的知识,希望对你有一定的参考价值。
1. 官方网站
官方站点:http://nginx.org/
2. 通过Docker使用Nginx
# 安装
docker pull nginx
# 运行
docker run -id -p 80:80 nginx
docker run -d -p 80:80 --name nginx01 容器id
# 重启
docker restart 容器id
# 关闭
docker stop 容器id
# 进入容器
docker exec
3. Nginx的目录结构
- 确定安装目录
Docker nginx的官方代码托管地址:https://github.com/nginxinc/docker-nginx
法一:通过dockerfile的定义来看;
法二:简单粗暴,直接搜索 find
4. Nginx基本配置
- 基本配置说明
# /etc/nginx/nginx.conf
user nginx; #配置worker进程运行用户
worker_processes 1; #配置工程进程数目,根据硬件配置,一般是和CPU数量一致,或者CPU数量的2倍,能达到最佳性能。
error_log /var/log/nginx/error.log warn; # 配置全局错误日志文件以及配置级别 [ debug | info | notice | warn | error | crit ]
pid /var/run/nginx.pid; #配置进程pid文件
关于日志级别:
在配置nginx.conf 的时候,有一项是指定错误日志的,默认情况下你不指定也没有关系,因为nginx很少有错误日志记录的。但有时出现问题时,是有必要记录一下错误日志的,方便我们排查问题。
error_log 级别分为 debug, info, notice, warn, error, crit 默认为crit, 该级别在日志名后边定义格式如下:
error_log /your/path/error.log crit;
crit 记录的日志最少,而debug记录的日志最多。如果你的nginx遇到一些问题,比如502比较频繁出现,但是看默认的error_log并没有看到有意义的信息,那么就可以调一下错误日志的级别,当你调成error级别时,错误日志记录的内容会更加丰富。
http
include /etc/nginx/mime.types; # 配置nginx支持哪些多媒体类型
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; #开启gzip压缩输出
include /etc/nginx/conf.d/*.conf; #多个server可以配置在该目录下
# /etc/nginx/conf.d/default.conf
# 在/etc/nginx/conf.d/下可以配置多个server
server
listen 80; #监听端口
server_name localhost; # 配置服务名
#charset utf-8; #配置字符集
#access_log /var/log/nginx/host.access.log main; #配置本虚拟主机访问日志
# 匹配/请求 ,/是根路径请求,会被该location匹配到并且处理
location /
root /usr/share/nginx/html; #root是配置服务器的默认根目录位置(document root)
index index.html index.htm; #配置首页文件的名称
#error_page 404 /404.html; #配置404页面
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html; #配置50x错误页面
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 Apaches document root
# concurs with nginxs one
#
#location ~ /\\.ht
# deny all;
#
- docker安装nginx并测试
docker pull nginx
mkdir -p web/conf,conf.d,html,log
新建如下两个配置文件:
① nginx.conf
# web/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;
② default.conf
# web/conf.d/default.conf
server
listen 80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location /
root /usr/share/nginx/html;
index index.html index.htm;
#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;
在conf.d/中还可以再定义几个关于server的配置文件xxx.conf。
在web/html/中存放项目网页。
启动docker
docker run --name nginx01 -d -p 80:80 \\
-v /root/web/log:/var/log/nginx \\
-v /root/web/conf/nginx.conf:/etc/nginx/nginx.conf \\
-v /root/web/conf.d:/etc/nginx/conf.d \\
-v /root/web/html:/usr/share/nginx/html \\
--rm \\
nginx
- events配置
# /etc/nginx/nginx.conf
events 是配置工作模式和连接数
events
worker_connections 1024; # 配置每个worker进程连接数上限
说明:nginx支持得总连接数=worker_processes * worker_connections
5. 反向代理
- 概述
代理方式 | 代理方向 | 类比 | 应用 |
正向代理 | 从trust zone(内网)到untrust zone(外网) | 防火墙 | 主要用于PAT,实现内网的隐藏(source address pat) |
反向代理 | 从untrust zone(外网)到trunst zone(内网) | 防火墙 | 主要用于向外部提供公网服务(端口转发,nat server)和负载均衡 |
反向代理的原理如下图:
- 反向代理的基本测试
docker中,nginx侦听172.17.0.2:80,tomcat侦听172.17.0.3:8080
# 配置文件/etc/nginx/conf.d/default.conf
server
listen 80;
server_name 172.17.0.2; # nginx的docker内部地址,也可以是映射的宿主机的地址,或者域名。
# 注:docker内部地址可用docker inspect <container_id> | grep -i ipadd命令来获取
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
# 配置反向代理
location /
proxy_pass http://172.17.0.3:8080/; # tomcat的docker内部地址
index index.html index.htm;
#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;
重启容器
docker restart <container_id>
直接重启不用带参数——docker run 时的参数已经缓存。
6. nginx负载均衡
- 常见的负载均衡方案:
- 硬件
F5 BIG-IP(本地流量管理器,4-7层负载均衡),Citrix NetScaler - 软件
LVS,Nginx,HAProxy,DNS轮询 - 云计算服务
Elastic Load Balancing
Nginx的原理:
- 负载均衡的基本测试
宿主机(192.168.74.166 www.fangfang.com):80
负载均衡至docker tomcat01(172.17.0.2):8080
负载均衡至docker tomcat02(172.17.0.3):8089
mkdir -p t1,2/conf,webapps
# 注意在制作容器卷前为了防止目录挂载出错,需要先把容器内的文件及目录考到宿主机上,以保持卷数据的一致性。
docker cp <container_id>:/opt/webenv/apache-tomcat-7.0.99/conf t1/
docker cp <container_id>:/opt/webenv/apache-tomcat-7.0.99/webapps t1/
修改$CATALINA_HOME/webapps/ROOT/中的index.jsp,以便区分效果
docker run -d --name tomcat01 --rm -p 8080:8080 -v /root/tomcat/t1/conf/:/opt/webenv/apache-tomcat-7.0.99/conf -v /root/tomcat/t1/webapps/:/opt/webenv/apache-tomcat-7.0.99/webapps <container_id>
docker run -d --name tomcat02 --rm -p 8089:8089 -v /root/tomcat/t2/conf/:/opt/webenv/apache-tomcat-7.0.99/conf -v /root/tomcat/t2/webapps/:/opt/webenv/apache-tomcat-7.0.99/webapps <container_id>
设定nginx的主配置文件(在http模块下配置)
# 配置文件/etc/nginx/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;
# 配置负载均衡
upstream www.fangfang.com
server 172.17.0.2:8080 weight=5;
server 172.17.0.3:8089 weight=10;
include /etc/nginx/conf.d/*.conf;
upstream是配置nginx与后端服务器负载均衡非常重要的一个模块,并且它还能对后端的服务器的健康状态进行检查,若后端服务器中的一台发生故障,则前端的请求不会转发到该故障的机器。weight是权重配置 权重越高 分配到的概率越高。
接着配置default.conf(配置http下的server模块)
# /etc/nginx/conf.d/default.conf
server
listen 80;
server_name www.fangfang.com;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location /
proxy_pass http://www.fangfang.com; # 这里配置成上边的upstream网址即可
index index.html index.htm;
#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;
这里可以使用docker stop来模拟一个tomcat宕机的情况。
7. nginx负载均衡策略
- 轮询(默认)
每个请求轮流(round-robin)分配到不同的后端服务器,如果后端服务器挂掉,则自动被剔除。
参考实例:
upstream www.fangfang.com
server 172.17.0.2:8080 ;
server 172.17.0.3:8089 ;
- 权重
根据weight权重,请求会根据权重比例分发给不同后端服务器,weight权重越高,分配的概率越大。实际分配,根据服务器硬件配置高低,来具体分配weight权重。硬件配置高的,weight就配置高点。
参考实例:
upstream www.fangfang.com
server 172.17.0.2:8080 weight=5;
server 172.17.0.3:8089 weight=10;
- IP地址哈希
ip_hash策略是根据用户客户端的IP的hash值来分配具体服务器,这样一个客户端会固定访问同一个服务器,而不论访问多少次。这样可以解决同一session在不同web服务器上不同步的问题。
参考配置:
ip_hash;
server 172.17.0.2:8080 ;
server 172.17.0.3:8089 ;
- 最少连接
web请求会被分发到连接数最少的服务器上。
参考实例:
least_conn;
server 172.17.0.2:8080 ;
server 172.17.0.3:8089 ;
以上是关于Nginx学习笔记(Docker版)-1的主要内容,如果未能解决你的问题,请参考以下文章