prefácio
Durante a implantação do projeto, a fim de maximizar o desempenho do acesso aos recursos, processaremos api
solicitações de recursos estáticos e solicitações dinâmicas separadamente, e a função que assume esse trabalho geralmente é nosso nginx
serviço. A seguir, usaremos nginx
a função de proxy reverso para separar as solicitações de recursos dinâmicos e estáticos, de modo a nos ajudar a implantar melhor os projetos em ambientes reais de produção.
docker compor compor
docker
Após a instalação docker compose
, precisamos gravar docker-compose.yaml
arquivos relacionados para nginx
nos prepararmos para iniciar o serviço. Geralmente, os abriremos para que possamos gravar arquivos docker hub
melhor ;docker-compose.yaml
Precisamos estar atentos aos seguintes pontos:
1. versão do espelho nginx;
2. O número da porta que precisa ser exposta;
3. Caminho da pasta onde os recursos estáticos são armazenados;
4. caminho do arquivo de configuração nginx;
- Para usar a
nginx
versão mais estável, é recomendável usá-lastable
, independentemente do número da versão, para que anginx
versão puxada seja a mais recente e estável. Se você deseja determinar a versão específica, também podemosnginx
acessar o site oficial site para verificar astable
versão mais recente e especificar o número da versão na configuração É isso, então usaremos astable
versão1.24.0
;
- Em relação
nginx
ao número da porta exposta, de acordo comhttp
os números de porta padrão do protocolo, geralmente escolhemos a80
porta exposta padrão.Se necessáriohttps
,443
a porta precisa ser exposta;
- Podemos
docker hub
encontrar o caminho da pasta de recursos estáticos dentro do contêiner/usr/share/nginx/html
. Precisamos considerar o mapeamento desse caminho de pasta para um caminho correspondente à máquina host. Eu costumo usar um caminho relativo./nginx/www
; - 想要使用反向代理功能,我们需要通过
nginx
配置文件来启动,从docker hub
可以找到配置文件nginx.conf
路径为:/etc/nginx/nginx.conf
,我们需要把这个文件映射到我们的宿主机,以便我们能够方便地修改配置,一般我会映射到相对路径./nginx/conf/nginx.conf
;
所以,最终我们编写好的docker-compose.yaml
文件为:
version: "3"
services:
nginx:
image: nginx:1.24.0
ports:
- "80:80"
volumes:
# 静态资源文件
- "./nginx/www:/usr/share/nginx/html"
# 配置文件
- "./nginx/conf/nginx/conf:/etc/nginx/nginx.conf"
nginx.conf配置
在上面的docker-compose.yaml
文件编写好后,我们还不能马上启动nginx
服务,因为我们的配置文件nginx.conf
还没有准备好,我们在编写配置文件时需要关注以下两件事情:
1.静态资源请求的路由策略;
2.动态资源请求的路由策略以及反向代理的目标服务;
-
我们的静态资源一般都是
css
、js
、html
、图片、字体等资源,像这类资源请求我们可以在nginx
中使用后缀匹配的方式来路由;location ~* .(css|js|html|xhtml|gif|jpg|jpeg|png|ico)$ { root /usr/share/nginx/html; index index.html index.xhtml; }
上述配置只是一个示例,如果有没有覆盖全的后缀请自行补充;
-
我们已经把静态资源全部处理完毕,那么剩下的就是动态请求了;另外我们还需要配置
nginx
把该动态请求路由到哪个目标服务上去;假如我们的目标服务为
http://192.168.2.218:8080
location / { proxy_pass http://192.168.2.218:8080; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Scheme $scheme; }
如果咱们的目标服务为集群部署,那么我们可以这样配置:
location / { proxy_pass http://target_servers; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Scheme $scheme; }
另外我们需要额外再配置一个
upstream
:upstream target_servers { server 192.168.2.218:8080; server 192.168.2.219:8080; server 192.168.2.220:8080; }
这样的话,我们就可以将动态请求分发给上述几个目标服务;
需要注意的是,如果目标服务与
nginx
实例在同一个宿主机,不能在nginx.conf
中写127.0.0.1
或localhost
,而应该使用局域网ip
,并保证nginx
实例能够ping
通该ip
或域名;
所以,我们最终的配置文件nginx.conf
为:
worker_processes 2;
error_log logs/error.log;
pid logs/nginx.pid;
events {
use epoll;
worker_connections 2048;
}
http {
include 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 logs/access.log main;
sendfile on;
# tcp_nopush on;
keepalive_timeout 65;
# gzip压缩功能设置
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 6;
gzip_types text/html text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
gzip_vary on;
# http_proxy 设置
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 75;
proxy_send_timeout 75;
proxy_read_timeout 75;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
# 设定负载均衡后台服务器列表
upstream target_servers {
server 192.168.2.218:8080;
server 192.168.2.219:8080;
server 192.168.2.220:8080;
}
# 很重要的虚拟主机配置
server {
listen 80;
server_name itoatest.example.com;
root /apps/oaapp;
charset utf-8;
access_log logs/host.access.log main;
# 静态资源路由
location ~* .(css|js|html|xhtml|gif|jpg|jpeg|png|ico)$ {
root /usr/share/nginx/html;
index index.html index.xhtml;
}
# 动态请求
location / {
proxy_pass http://target_servers;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
}
}
}
启动nginx服务
Depois que os dois arquivos acima estiverem prontos, precisamos nginx.conf
colocar os arquivos ./nginx/conf
no caminho relativo. Além disso, precisamos colocar os arquivos de recursos estáticos ./nginx/www
no caminho relativo. Finalmente, usamos o comando start docker-compose up -d
para iniciar nginx
o serviço e, finalmente, nosso requisição é nginx
passada funções separadas;