dokcer部署nginx及web应用的那些坑

好久没有玩nginx了,有些忘了。昨天使用docker部署的时候遇到了几个低级但难以发现的问题,在这里记录下。

一、部署

部署很简单,规划好目录,写好配置文件即可,操作如下。

1、目录规划

创建配置文件、日志以及web应用的路径,以映射到容器中:

$ mkdir -p /home/nginx/conf
$ mkdir -p /home/nginx/log
$ mkdir -p /home/html

2、创建nginx的配置文件

先是 nginx.conf,可参考下方配置,按需修改:

user  root;
worker_processes  2;
events {
    worker_connections  1024;
}
 
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    #tcp_nopush     on;
 
    #keepalive_timeout  0;
    #keepalive_timeout  65;
 
    #gzip  on;

        server {
                server_name  server;
                listen 80;
                client_max_body_size 1000m; 

                location / {
                        # 开启gzip
                        gzip on;
                        # 启用gzip压缩的最小文件,小于设置值的文件将不会压缩
                        gzip_min_length 1k;
 
                        # gzip 压缩级别,1-9,数字越大压缩的越好,也越占用CPU时间,后面会有详细说明
                        gzip_comp_level 2;
 
                        # 进行压缩的文件类型。javascript有多种形式,后面的图片压缩不需要的可以自行删除
                        gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
 
                        # 是否在http header中添加Vary: Accept-Encoding,建议开启
                        gzip_vary on;
 
                        # 设置压缩所需要的缓冲区大小     
                        gzip_buffers 4 16k;

                        proxy_set_header Host $http_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 https;

                        # 这里写的是容器中html的路径,而不是主机上的。切记!
                        root /usr/share/nginx/html;
                        index index.html index.php index.htm;
                }


                location /api {
                        # 配置宿主机的内网地址,不能是localhost或127
                        proxy_pass http://10.0.20.10:7040/;
                }
        } 
}

在nginx的配置文件中,include了 mime.types ,因此在conf路径下还需要编写 mime.types文件,内容可如下:

types {
    text/html                                        html htm shtml;
    text/css                                         css;
    text/xml                                         xml;
    image/gif                                        gif;
    image/jpeg                                       jpeg jpg;
    application/javascript                           js;
    application/atom+xml                             atom;
    application/rss+xml                              rss;


    text/mathml                                      mml;
    text/plain                                       txt;
    text/vnd.sun.j2me.app-descriptor                 jad;
    text/vnd.wap.wml                                 wml;
    text/x-component                                 htc;


    image/avif                                       avif;
    image/png                                        png;
    image/svg+xml                                    svg svgz;
    image/tiff                                       tif tiff;
    image/vnd.wap.wbmp                               wbmp;
    image/webp                                       webp;
    image/x-icon                                     ico;
    image/x-jng                                      jng;
    image/x-ms-bmp                                   bmp;


    font/woff                                        woff;
    font/woff2                                       woff2;


    application/java-archive                         jar war ear;
    application/json                                 json;
    application/mac-binhex40                         hqx;
    application/msword                               doc;
    application/pdf                                  pdf;
    application/postscript                           ps eps ai;
    application/rtf                                  rtf;
    application/vnd.apple.mpegurl                    m3u8;
    application/vnd.google-earth.kml+xml             kml;
    application/vnd.google-earth.kmz                 kmz;
    application/vnd.ms-excel                         xls;
    application/vnd.ms-fontobject                    eot;
    application/vnd.ms-powerpoint                    ppt;
    application/vnd.oasis.opendocument.graphics      odg;
    application/vnd.oasis.opendocument.presentation  odp;
    application/vnd.oasis.opendocument.spreadsheet   ods;
    application/vnd.oasis.opendocument.text          odt;
    application/vnd.openxmlformats-officedocument.presentationml.presentation
                                                     pptx;
    application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
                                                     xlsx;
    application/vnd.openxmlformats-officedocument.wordprocessingml.document
                                                     docx;
    application/vnd.wap.wmlc                         wmlc;
    application/wasm                                 wasm;
    application/x-7z-compressed                      7z;
    application/x-cocoa                              cco;
    application/x-java-archive-diff                  jardiff;
    application/x-java-jnlp-file                     jnlp;
    application/x-makeself                           run;
    application/x-perl                               pl pm;
    application/x-pilot                              prc pdb;
    application/x-rar-compressed                     rar;
    application/x-redhat-package-manager             rpm;
    application/x-sea                                sea;
    application/x-shockwave-flash                    swf;
    application/x-stuffit                            sit;
    application/x-tcl                                tcl tk;
    application/x-x509-ca-cert                       der pem crt;
    application/x-xpinstall                          xpi;
    application/xhtml+xml                            xhtml;
    application/xspf+xml                             xspf;
    application/zip                                  zip;


    application/octet-stream                         bin exe dll;
    application/octet-stream                         deb;
    application/octet-stream                         dmg;
    application/octet-stream                         iso img;
    application/octet-stream                         msi msp msm;


    audio/midi                                       mid midi kar;
    audio/mpeg                                       mp3;
    audio/ogg                                        ogg;
    audio/x-m4a                                      m4a;
    audio/x-realaudio                                ra;


    video/3gpp                                       3gpp 3gp;
    video/mp2t                                       ts;
    video/mp4                                        mp4;
    video/mpeg                                       mpeg mpg;
    video/quicktime                                  mov;
    video/webm                                       webm;
    video/x-flv                                      flv;
    video/x-m4v                                      m4v;
    video/x-mng                                      mng;
    video/x-ms-asf                                   asx asf;
    video/x-ms-wmv                                   wmv;
    video/x-msvideo                                  avi;
}

3、启动nginx

上述工作完成后,即可按如下命令启动nginx:

docker run -p 80:80 --name nginx \
-v /home/html:/usr/share/nginx/html \
-v /home/nginx/log:/var/log/nginx \
-v /home/nginx/conf:/etc/nginx \
-d nginx:latest

二、配置文件的坑

按照前文的部署,将web服务器的root路径映射到了主机上的 /home/html 路径中。因此在启动nginx前,需要将你的web应用放置到主机的该路径下。

第一个坑:找不到root路径

你需要注意:

你的/home/nginx/conf/nginx.conf 中配置的 root 路径,一定是你 容器中的路径!而不是宿主机上的路径!

如本例中,要配置成

root /usr/share/nginx/html;

而不能是宿主机的路径:

root /home/html;

第二个坑:web应用无法访问宿主机上的服务

如前文中的转发配置:

    location /api {
                    # 配置宿主机的内网地址,不能是localhost或127
                    proxy_pass http://10.0.20.10:7040/;
    }

如果你的后端服务是直接部署在宿主机上的,而不是跟nginx在同一个容器中,如注释所说,这里一定要配置宿主机的地址,而不能是 localhost 或127.0.0.1。


写在最后

其实这都是简答的些细节问题,但实操过程中可能不会第一时间想到。

总结起来就一点:

docker部署应用时,如果存在配置或路径映射的情况,在写配置文件时要重点注意:把容器环境和宿主机环境分开来看,容器中的应用依赖的是容器中的ip地址、文件路径,而不是宿主机的。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员柒叔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值