好久没有玩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地址、文件路径,而不是宿主机的。