基于Docker安装Nginx及其常用配置
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就启动完了,测试效果如下
映射核心目录
上面启动了一个最基本的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
上图红框即为容器的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 宿主机与容器的映射关系
-
进入容器
docker exec -it 容器id /bin/bash
-
容器重启、重新加载
docker exec -t 容器id nginx -t docker exec -t 容器id nginx -s reload
常用配置
请求代理
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的状态
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;