Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。因为其优秀的性能,使得其成为日常开发,线上运营必不可少的软件了。下面就通过Docker,搭建一个nginx环境。

docker run --name nginx -p 80:80 -v $PWD/html:/usr/share/nginx/html -e LANG=C.UTF-8 -e LC_ALL=C.UTF-8 --privileged=true  -d nginx

**

搭建nginx服务完成后,访问403问题

**

–privileged=true 修改容器权限,给容器加特权
宿主机 chmod 777 $PWD/html
此处需要特别注意的是:宿主机映射的目录最好不要在root下新建文件夹,因为也会涉及到权限问题,所以可以在别的目录下新建。(如果宿主机和容器都没有把权限配置好就会出现访问403)

映射核心目录
上面启动了一个最基本的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用于保存日志

nginx、挂载文件、docker容器中文乱码

nginx服务端,nginx.conf设置utf-8编码格式:注意server层 和 访问路径location都要配置一下

server {
    listen 81;
    set $root F:/Develop/nginx-1.14.0/html;
    root $root; 
server_name  localhost;
    access_log  logs/host.access.log  main;
    index index.html index.php;
    #设置字符集
    charset utf-8;
 
    location / {
        root html;
        index index.html index.htm;
        charset utf-8;
    }
}

docker-compose.yml 脚本如下:

version: '3'
services:
  nginx:
    image: nginx:latest
    container_name: nginx_01
    volumes:
    - /Users/liqi/docker-compose/nginx/conf.d:/etc/nginx/conf.d
    - /Users/liqi/docker-compose/nginx/nginx.conf:/etc/nginx/nginx.conf
    - /Users/liqi/docker-compose/nginx/html:/usr/share/nginx/html
    - /Users/liqi/docker-compose/nginx/log:/var/log/nginx
    environment:
      - LANG=C.UTF-8
      - LC_ALL=C.UTF-8
    ports:
    - 80:80

原文链接:

拷贝默认配置

第一步,按上面的方式启动一个最基础的容器 并获取其对应的容器 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 (KaTeX parse error: Undefined control sequence: \? at position 28: …~* /downLoad.do\̲?̲loadFile=/aaa/b…arg_loadFile? permanent;
}
将路径中特定的关键字转换为另外的关键字
如将请求地址中的AAA转换为abc http://127.0.0.1/AAA/index.html 会重写为 http://127.0.0.1/abc/index.html

if (KaTeX parse error: Expected '}', got 'EOF' at end of input: …rite ^/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
'[KaTeX parse error: Expected 'EOF', got '#' at position 17: …ime_iso8601] ' #̲ 通用日志格式的本地时间 '[hostname] ’ # 主机名
'[KaTeX parse error: Expected 'EOF', got '#' at position 16: remote_addr] ' #̲ 客户端地址 '[remote_port] ’ # 客户端端口
'[KaTeX parse error: Expected 'EOF', got '#' at position 15: connection] ' #̲ 连接序列号 '[server_addr] ’ # 接受请求的服务器的地址
'[KaTeX parse error: Expected 'EOF', got '#' at position 16: server_port] ' #̲ 接受请求的服务器的端口 '[request_id] ’ # 请求的唯一ID
'[KaTeX parse error: Expected 'EOF', got '#' at position 19: …uest_method] ' #̲ 请求方式 '[request_uri] ’ # 完整的原始请求URI
'[KaTeX parse error: Expected 'EOF', got '#' at position 17: …equest_time] ' #̲ 请求以毫秒为单位的处理时间,…request_length] ’ # 请求长度
'[KaTeX parse error: Expected 'EOF', got '#' at position 17: …equest_body] ' #̲ 请求主体 '[-] ' #'…bytes_received] ’ #从客户端收到的字节数
'[KaTeX parse error: Expected 'EOF', got '#' at position 17: …ontent_type] ' #̲ 内容类型 '[content_length] ’ # 内容长度
'[KaTeX parse error: Expected 'EOF', got '#' at position 16: remote_user] ' #̲ 基本身份验证随附的用户名 '…request] ’ # 完整的原始请求行
'[KaTeX parse error: Expected 'EOF', got '#' at position 11: scheme] ' #̲ 请求方案 http或http…msec] ’ # 请求以秒为单位的时间戳
‘[-] ’ #’[KaTeX parse error: Expected 'EOF', got '#' at position 13: protocol] ' #̲ 与客户端通信的协议: TCP…session_time] ’ # 会话持续时间
'[KaTeX parse error: Expected 'EOF', got '#' at position 18: …stream_addr] ' #̲ 与上游的连接地址 '[upstream_response_time] ’ # 从上游接受响应的耗时
'[KaTeX parse error: Expected 'EOF', got '#' at position 26: …onnect_time] ' #̲ 与上游建立连接的时间 '[-…upstream_bytes_sent] ’ # 发送到上游服务器的字节数
'[KaTeX parse error: Expected 'EOF', got '#' at position 28: …es_received] ' #̲ 发送到上游服务器的字节数 '…upstream_status] ’ # 从上游获取的响应状态
'[KaTeX parse error: Expected 'EOF', got '#' at position 11: status] ' #̲ 响应状态 '[body_bytes_sent] ’ # 发送给客户端的字节数,不计算响应头
'[KaTeX parse error: Expected 'EOF', got '#' at position 15: bytes_sent] ' #̲ 发送给客户端的字节数 '[http_user_agent] ’
'[KaTeX parse error: Double superscript at position 17: …ttp_referer] ' '̲[http_host] ’
'[KaTeX parse error: Double subscript at position 7: 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;

设置最大body的大小

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

client_max_body_size 50m;

设置请求头的大小

server_names_hash_bucket_size 256;
client_header_buffer_size 256k;
large_client_header_buffers 4 256k;