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(外网)

防火墙​​SNAT​​应用

主要用于PAT,实现内网的隐藏(source address pat)

反向代理

从untrust zone(外网)到trunst zone(内网)

防火墙​​DNAT​​应用

主要用于向外部提供公网服务(端口转发,nat server)和负载均衡

反向代理的原理如下图:

Nginx学习笔记(Docker版)-1_docker

  • 反向代理的基本测试
    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的原理:

Nginx学习笔记(Docker版)-1_docker_02

  • 负载均衡的基本测试
    宿主机(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的主要内容,如果未能解决你的问题,请参考以下文章

统信下docker安装nginx并挂载宿主机文件夹

Nginx官方镜像私有化定制,实现时区同步及自动挂载配置文件到宿主机

Docker学习笔记走进docker的世界

docker学习笔记2 -- 资源限制

Docker 安装 Nginx 容器 (完整详细版)

docker学习笔记- 仓库