1.1、启动nginx容器配置文件映射到主机
#拉取镜像
docker pull nginx:1.25
#启动临时nginx容器,拿配置文件
docker run --rm -d --name=temp-nginx nginx:1.25
mkdir -p /root/nginx/conf
mkdir -p /var/log/nginx
docker cp temp-nginx:/etc/nginx/nginx.conf /root/nginx/conf/nginx.conf
docker cp temp-nginx:/etc/nginx/conf.d /root/nginx/conf/conf.d
docker cp temp-nginx:/usr/share/nginx/html/ /root/nginx
#删除临时容器
docker rm -f temp-nginx
1.2、启动容器
docker run --name nginx --restart=always -p 80:80 \
-v /root/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /root/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /root/nginx/html:/usr/share/nginx/html \
-v /root/nginx/log:/var/log/nginx \
-d nginx:1.25
访问地址:
http://192.168.52.128
#查看配置文件
cat /root/nginx/conf/nginx.conf
#Nginx用户及组
#用户 组。window下不指定
user nginx;
##工作进程:数目。根据硬件调整,通常等于CPU数量或者2倍于CPU。
worker_processes auto;
#错误日志:存放路径。
error_log /var/log/nginx/error.log notice;
#pid(进程标识符):存放路径。
pid /var/run/nginx.pid;
#每个工作进程的最大连接数量。根据硬件调整,和前面工作进程配合起来用。
events {
worker_connections 1024;
}
#http块(http设置)
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;
#server块,单独放到配置文件,默认加载/etc/nginx/conf.d/*.conf配置文件
include /etc/nginx/conf.d/*.conf;
}
1、server块可以配置多个,每个server块,相当于一个虚拟主机。
cat /root/nginx/conf/conf.d/default.conf
#访问http://192.168.52.128:8080,实际访问的是本地的 /usr/share/nginx/html文件
server {
listen 8080;
listen [::]:8080;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
server {
listen 8081;
server_name proxy.kutian.edn1;
location / {
proxy_pass http://172.31.185.29:8080;
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;
}
}
server {
listen 8081;
server_name www.vm.cn;
location / {
proxy_pass http://172.31.185.28:8080;
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;
}
}
4、 一个nginx配置文件中可以有多个server_name,listen相同的虚拟主机。匹配多个时,默认使用匹配到的第一个server。
配置举例:
server {
listen 8081;
server_name www.vm.cn;
location / {
proxy_pass http://172.31.185.28:8080;
proxy_set_header Host $host;
#手动指定IP
#proxy_set_header Host 172.17.2.2;
#proxy_set_header Host $http_host;
#proxy_set_header Host $proxy_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;
}
}
服务端验证配置Host是否生效:
下面是,http://172.31.185.28:8080服务的代码,我是用java起的服务验证Host配置是否生效的。
@GetMapping("")
public Boolean test(HttpServletRequest request) {
//获取Header中的所有key
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement();
if (Objects.equals("host", headerName)) {
String headerValue = request.getHeader(headerName);
System.out.println("headerName: " + headerName);
System.out.println("headerValue: " + headerValue);
System.out.println();
}
}
return true;
}
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
server {
listen 8081;
server_name www.vm.cn;
client_header_timeout 5s; #针对 ddos
client_header_buffer_size 512k;
large_client_header_buffers 4 512k;
location / {
proxy_pass http://172.31.185.28:8080;
proxy_redirect off;
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 Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
client_max_body_size 500m; #允许客户端请求的最大单文件字节数
client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数,
proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时)
proxy_send_timeout 60s; #后端服务器数据回传时间(代理发送超时)
proxy_read_timeout 60s; #连接成功后,后端服务器响应时间(代理接收超时)--
proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传
}
}
密钥文件需要自己替换下
server {
listen 8081;
listen 443 ssl;
server_name iam-apigateway-proxy.cxy.sd.cegn.cn;
ssl_certificate /etc/nginx/ssl/default.pem;
ssl_certificate_key /etc/nginx/ssl/key.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 SSLv3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_session_timeout 5m;
server_name www.vm.cn;
client_header_timeout 5s; #针对 ddos
client_header_buffer_size 512k;
large_client_header_buffers 4 512k;
location / {
proxy_pass http://172.31.185.28:8080;
proxy_redirect off;
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 Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
client_max_body_size 500m; #允许客户端请求的最大单文件字节数
client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数,
proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时)
proxy_send_timeout 60s; #后端服务器数据回传时间(代理发送超时)
proxy_read_timeout 60s; #连接成功后,后端服务器响应时间(代理接收超时)--
proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传
}
}