2020-06-28
Ann Ann
Nginx 的最大作用,就是搭建一个 Web Server。有了容器,只要一行命令,服务器就架设好了,完全不用配置。
$ docker container run \
-d \
-p 127.0.0.2:8080:80 \
--rm \
--name mynginx \
nginx
上面命令下载并运行官方的 Nginx image,默认是最新版本(latest),当前是 1.13.9。如果本机安装过以前的版本,请删掉重新安装,因为只有 1.13.9 才开始支持 server push。
上面命令的各个参数含义如下。
-d
:在后台运行-p
:容器的80
端口映射到127.0.0.2:8080
--rm
:容器停止运行后,自动删除容器文件--name
:容器的名字为mynginx
如果没有报错,就可以打开浏览器访问 127.0.0.2:8080 了。正常情况下,显示 Nginx 的欢迎页。
然后,把这个容器终止,由于--rm
参数的作用,容器文件会自动删除。
$ docker container stop mynginx
网页文件都在容器里,没法直接修改,显然很不方便。下一步就是让网页文件所在的目录/usr/share/nginx/html
映射到本地。
首先,新建一个目录,并进入该目录。
$ mkdir nginx-docker-demo
$ cd nginx-docker-demo
然后,新建一个html
子目录。
$ mkdir html
在这个子目录里面,放置一个index.html
文件,内容如下。
<h1>Hello World</h1>
接着,就可以把这个子目录html
,映射到容器的网页文件目录/usr/share/nginx/html
。
$ docker container run \
-d \
-p 127.0.0.2:8080:80 \
--rm \
--name mynginx \
--volume "$PWD/html":/usr/share/nginx/html \
nginx
打开浏览器,访问 127.0.0.2:8080,应该就能看到 Hello World 了。
修改网页文件还不够,还要修改 Nginx 的配置文件,否则后面没法加 SSL 支持。
首先,把容器里面的 Nginx 配置文件拷贝到本地。
$ docker container cp mynginx:/etc/nginx .
上面命令的含义是,把mynginx
容器的/etc/nginx
拷贝到当前目录。不要漏掉最后那个点。
执行完成后,当前目录应该多出一个nginx
子目录。然后,把这个子目录改名为conf
。
$ mv nginx conf
现在可以把容器终止了。
$ docker container stop mynginx
重新启动一个新的容器,这次不仅映射网页目录,还要映射配置目录。
$ docker container run \
--rm \
--name mynginx \
--volume "$PWD/html":/usr/share/nginx/html \
--volume "$PWD/conf":/etc/nginx \
-p 127.0.0.2:8080:80 \
-d \
nginx
上面代码中,--volume "$PWD/conf":/etc/nginx
表示把容器的配置目录/etc/nginx
,映射到本地的conf
子目录。
浏览器访问 127.0.0.2:8080,如果能够看到网页,就说明本地的配置生效了。这时,可以把这个容器终止。
$ docker container stop mynginx
现在要为容器加入 HTTPS 支持,第一件事就是生成私钥和证书。正式的证书需要证书当局(CA)的签名,这里是为了测试,搞一张自签名(self-signed)证书就可以了。
下面,我参考的是 DigitalOcean 的教程。首先,确定你的机器安装了 OpenSSL,然后执行下面的命令。
$ sudo openssl req \
-x509 \
-nodes \
-days 365 \
-newkey rsa:2048 \
-keyout example.key \
-out example.crt
上面命令的各个参数含义如下。
req
:处理证书签署请求。-x509
:生成自签名证书。-nodes
:跳过为证书设置密码的阶段,这样 Nginx 才可以直接打开证书。-days 365
:证书有效期为一年。-newkey rsa:2048
:生成一个新的私钥,采用的算法是2048位的 RSA。-keyout
:新生成的私钥文件为当前目录下的example.key
。-out
:新生成的证书文件为当前目录下的example.crt
。执行后,命令行会跳出一堆问题要你回答,比如你在哪个国家、你的 Email 等等。
其中最重要的一个问题是 Common Name,正常情况下应该填入一个域名,这里可以填 127.0.0.2。
Common Name (e.g. server FQDN or YOUR name) []:127.0.0.2
回答完问题,当前目录应该会多出两个文件:example.key
和example.crt
。
conf
目录下新建一个子目录certs
,把这两个文件放入这个子目录。
$ mkdir conf/certs
$ mv example.crt example.key conf/certs
有了私钥和证书,就可以打开 Nginx 的 HTTPS 了。
首先,打开conf/conf.d/default.conf
文件,在结尾添加下面的配置。
server {
listen 443 ssl http2;
server_name localhost;
ssl on;
ssl_certificate /etc/nginx/certs/example.crt;
ssl_certificate_key /etc/nginx/certs/example.key;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
然后,启动一个新的 Nginx 容器。
$ docker container run \
--rm \
--name mynginx \
--volume "$PWD/html":/usr/share/nginx/html \
--volume "$PWD/conf":/etc/nginx \
-p 127.0.0.2:8080:80 \
-p 127.0.0.2:8081:443 \
-d \
nginx
上面命令中,不仅映射了容器的80端口,还映射了443端口,这是 HTTPS 的专用端口。
打开浏览器,访问 https://127.0.0.2:8081/ 。因为使用了自签名证书,浏览器会提示不安全。不要去管它,选择继续访问,应该就可以看到 Hello World 了。
至此,Nginx 容器的 HTTPS 支持就做好了。有了这个容器,下一篇文章,我就来试验 HTTP/2 的 server push 功能。
IT Support 训练营01期
2025/11/10 06:13 (Sydney)
CCNA考证班01期
2025/09/06 08:37 (Sydney)
商业数据分析实战班第17期
2025/03/15 06:13 (Sydney)
地址
Level 10b, 144 Edward Street, Brisbane CBD(Headquarter)Level 2, 171 La Trobe St, Melbourne VIC 3000四川省成都市武侯区桂溪街道天府大道中段500号D5东方希望天祥广场B座45A13号Business Hub, 155 Waymouth St, Adelaide SA 5000Disclaimer
JR Academy acknowledges Traditional Owners of Country throughout Australia and recognises the continuing connection to lands, waters and communities. We pay our respect to Aboriginal and Torres Strait Islander cultures; and to Elders past and present. Aboriginal and Torres Strait Islander peoples should be aware that this website may contain images or names of people who have since passed away.
匠人学院网站上的所有内容,包括课程材料、徽标和匠人学院网站上提供的信息,均受澳大利亚政府知识产权法的保护。严禁未经授权使用、销售、分发、复制或修改。违规行为可能会导致法律诉讼。通过访问我们的网站,您同意尊重我们的知识产权。 JR Academy Pty Ltd 保留所有权利,包括专利、商标和版权。任何侵权行为都将受到法律追究。查看用户协议
© 2017-2024 JR Academy Pty Ltd. All rights reserved.
ABN 26621887572