基于Docker安装Nginx及其常用配置

  |   0 评论   |   0 浏览

image-20201108221901871 如遇图片加载失败,可尝试使用手机流量访问Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。因为其优秀的性能,使得其成为日常开发,线上运营必不可少的软件了。下面就通过Docker,搭建一个nginx环境。

不了解Docker的,可以通过以下文章安装了解:

[ CentOS 7下安装Docker及基础操作 ] : https://lupf.cn/articles/2019/11/23/1574503815568.html

[ 基于VirtualBox搭建Linux(CentOS 7)虚拟机环境(学习必备技能)] : https://lupf.cn/articles/2020/04/04/1586001434581.html

Nginx

  • 下载
    docker pull nginx
    
简单运行
  • 示例

    如果我们只是想单纯的启动一个Nginx服务,其实是非常简单的

    docker run --name my-nginx -p 80:80 -d nginx
    docker ps | grep my-nginx
    

    --name my-nginx 指定容器的名称

    -p 80:80 映射端口

    -d 守护进程运行

    nginx 镜像版本,也可以指定版本,如:nginx:1.18.0

    如果单纯想启动一个测试用的nginx就启动完了,测试效果如下

    image-20201108162003367 如遇图片加载失败,可尝试使用手机流量访问

映射核心目录

上面启动了一个最基本的nginx;但是实际的使用过程中,并只是像这样就完了,我们要需要对nginx进行一系列的配置,来满足其容器、代理的角色。

  • 创建文件目录

    mkdir -p /opt/docker/nginx/conf/conf.d
    mkdir -p /opt/docker/nginx/html
    mkdir -p /opt/docker/nginx/logs
    

    conf 和conf.d分别用于保存配置文件

    html用于放置静态文件

    logs用于保存日志

  • 拷贝默认配置

    • 第一步,按上面的方式启动一个最基础的容器 并获取其对应的容器 ld

      docker run --name my-nginx -p 80:80 -d nginx
      docker ps | grep my-nginx
      

      image-20201108162550869 如遇图片加载失败,可尝试使用手机流量访问

      上图红框即为容器的id,下面拷贝的时候用的上

    • 第二步,拷贝容器中默认的配置文件

      docker cp 124136acacc3:/etc/nginx/nginx.conf /opt/docker/nginx/conf/nginx.conf
      docker cp 124136acacc3:/etc/nginx/conf.d /opt/docker/nginx/conf
      docker cp 124136acacc3:/usr/share/nginx/html /opt/docker/nginx
      
      # 拷贝完之后就停止并删除容器
      docker stop 124136acacc3
      docker rm 124136acacc3
      
  • 启动服务

    docker run \
    -p 80:80 \
    --name my-nginx \
    --restart=always \
    -v /opt/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
    -v /opt/docker/nginx/conf/conf.d:/etc/nginx/conf.d \
    -v /opt/docker/nginx/html:/usr/share/nginx/html \
    -v /opt/docker/nginx/logs:/var/log/nginx \
    -d \
    nginx
    

    --restart=always 一直保持运行,自动启动

    -v 宿主机与容器的映射关系

    image-20201108163511817 如遇图片加载失败,可尝试使用手机流量访问

  • 进入容器

    docker exec -it 容器id /bin/bash
    
  • 容器重启、重新加载

    docker exec -t 容器id nginx -t
    docker exec -t 容器id nginx -s reload
    

    image-20201108163936537 如遇图片加载失败,可尝试使用手机流量访问

常用配置

请求代理
location /abc/ {
    proxy_pass http://127.0.0.1:8880/;
    proxy_read_timeout 90;

    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $http_connection;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_cache_bypass $http_upgrade;
}

请求 http://127.0.0.1/abc/index.html 会代理到 http://127.0.0.1:8080/index.html

ssl证书配置
listen 443 ssl;
#填写绑定证书的域名
server_name www.test.com;
ssl on;
ssl_certificate /路径/www.test.com.crt;
ssl_certificate_key /路径/www.test.com.key;
ssl_session_timeout 5m;
#按照这个协议配置
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#按照这个套件配置
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
http强转https

所有的http请求都会被重写到https

server {
    listen 80;
    server_name www.test.com;
    default_type 'text/html';
    charset utf-8;
    rewrite ^/(.*) https://$server_name/$1 permanent; #跳转到Https
}
特定地址重定向

如将下载更新的页面重定向到腾讯应用宝

location /download.html {
    rewrite ^/(.*) https://sj.qq.com/myapp/detail.htm?apkName=com.xxx.yyy permanent;
}

将指定的地址重定向为另外一个地址,参数不变

if ($request_uri ~* /downLoad.do\?loadFile=/aaa/bbb) {
    rewrite ^/(.*) https://www.test.com/upload/file$arg_loadFile? permanent;
}
将路径中特定的关键字转换为另外的关键字

如将请求地址中的AAA转换为abc http://127.0.0.1/AAA/index.html 会重写为 http://127.0.0.1/abc/index.html

if ($request_uri ~* ^(/AAA/)) {
    rewrite ^/AAA/(.*)$ /abc/$1 last;
}
设置DNS服务器
resolver 223.5.5.5 223.6.6.6 1.2.4.8 114.114.114.114 valid=3600s;
代理特定的文件

如进行微信认证时需要指定特定的文件放在域名的根目录下

root指向放置MP_verify_aaabbbcccddd.txt的目录

location /MP_verify_aaabbbcccddd.txt {
     root /opt/data/路径/;
}
查看当前nginx的状态
location /status {
    stub_status on;
    access_log /var/log/nginx/status.log; #日志
}

配置好并重启 可以通过 http://127.0.0.1/status 来查看当前nginx的状态

image-20201108213009213 如遇图片加载失败,可尝试使用手机流量访问

lua文件配置
location /test/ {
    default_type text/html;
    #lua_code_cache off; #是否开启lua的缓存;开启之后只有第一次启动的时候会编译;不开启每次执行都编译
    set $lable 0; # 设置一个变量,用来校验是否匹配了lua脚本
    
    # if ($request_uri ~* /abc.*/bbb) { # p判断是否匹配abc打头的请求 如: /abcddd/bbb  /abc123/bbb
    # 判断请求路径是否包含了 /aaa/bbb
    if ( $request_uri ~* /aaa/bbb ) {
        set $lable 1; # 给变量赋值
        content_by_lua_file /opt/docker/nginx/lua/test.lua;
    }
    
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Real-Port $remote_port;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://127.0.0.1:8080/;
}
代理静态文件(如图片)
location /aaa/bbb/ {
    root /opt/docker/nginx/;
}

如访问 http://127.0.0.1/aaa/bbb/1.png 实际是会代理到 /opt/docker/nginx/aaa/bbb目录下的1.png

静态页面代理
location /hello/ {
    index index.html;
    root /opt/docker/nginx/html/;
}

访问 http://127.0.0.1/hello/ 会代理到**/opt/docker/nginx/html/路径下的index.html**页面

配置日志输出
access_log  logs/access.log  main;

log_format  main
'[$time_iso8601] ' # 通用日志格式的本地时间
'[$hostname] ' # 主机名
'[$remote_addr] ' # 客户端地址
'[$remote_port] ' # 客户端端口
'[$connection] ' # 连接序列号
'[$server_addr] ' # 接受请求的服务器的地址
'[$server_port] ' # 接受请求的服务器的端口
'[$request_id] '  # 请求的唯一ID
'[$request_method] ' # 请求方式
'[$request_uri] ' # 完整的原始请求URI
'[$request_time] ' # 请求以毫秒为单位的处理时间,以毫秒为单位(1.3.9,1.2.6);从客户端读取第一个字节以来经过的时间
'[$request_length] ' # 请求长度
'[$request_body] ' # 请求主体
'[-] ' #'[$bytes_received] ' #从客户端收到的字节数
'[$content_type] ' # 内容类型
'[$content_length] ' # 内容长度
'[$remote_user] ' # 基本身份验证随附的用户名
'[$request] ' # 完整的原始请求行
'[$scheme] ' # 请求方案 http或https
'[$msec] ' # 请求以秒为单位的时间戳
'[-] ' #'[$protocol] ' # 与客户端通信的协议: TCP或UDP
'[-] ' #'[$session_time] ' # 会话持续时间
'[$upstream_addr] ' # 与上游的连接地址
'[$upstream_response_time] ' # 从上游接受响应的耗时
'[$upstream_connect_time] ' # 与上游建立连接的时间
'[-] ' #'[$upstream_bytes_sent] ' # 发送到上游服务器的字节数
'[$upstream_bytes_received] ' # 发送到上游服务器的字节数
'[$upstream_status] ' # 从上游获取的响应状态
'[$status] ' # 响应状态
'[$body_bytes_sent] ' # 发送给客户端的字节数,不计算响应头
'[$bytes_sent] ' # 发送给客户端的字节数
'[$http_user_agent] '
'[$http_referer] '
'[$http_host] '
'[$http_x_forwarded_for] '
'[$http_Authorization] '
'[$cookie_uid] ';  
配置跨域
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-Port $remote_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods *;
add_header Access-Control-Allow-Headers *;
if ($request_method = 'OPTIONS') 
{
	return 204;
}
设置最大body的大小

如上传文件,指定最大的文件大小

client_max_body_size 50m;
设置请求头的大小
server_names_hash_bucket_size 256;
client_header_buffer_size 256k;
large_client_header_buffers 4 256k;
客户端保持连接的时间
keepalive_timeout 60s;


标题:基于Docker安装Nginx及其常用配置
作者:码霸霸
地址:https://blog.lupf.cn/articles/2020/11/08/1604845476002.html