工作中經常需要在服務器上來做一下實驗,親自動手看看效果是否與理論描述的相同。用docker可以很方便的配置所需要的環境,以下內容記錄了如何用docker配置一個nginx服務器
下載nginx
從默認的中央倉庫下載nginx
docker pull nginx
啟動nginx images並進入后台
docker run -it nginx /bin/bash
通過查看linux發行版知曉用哪個包管理工具
cat /proc/version
Linux version 4.14.92-boot2docker (root@2c85d808f0f3) (gcc version 6.3.0 20170516 (Debian 6.3.0-18+deb9u1)) #1 SMP Wed Jan 9 22:03:23 UTC 2019
可以看到這里默認用的是Debian,因此包管理工具使用apt-get
安裝常用工具vim curl等
apt-get install vim
如果安裝不了,命令提示如下
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package vim
這時候需要敲:apt-get update
,這個命令的作用是:同步 /etc/apt/sources.list 和 /etc/apt/sources.list.d 中列出的源的索引,這樣才能獲取到最新的軟件包。
等更新完畢以后重新執行apt-get install vim命令即可。
設置ll別名
vi ~/.bashrc
添加下面這句
alias ll='ls $LS_OPTIONS -l'
docker端口映射方便本機訪問
docker run -p 8080:80 -it nginx /bin/bash
在宿主機中訪問localhost:8080即可看到nginx歡迎頁面
注意
在window中宿主機是192.168.99.100,所以訪問地址是http://192.168.99.100:8080
原因:docker是運行在Linux上的,在Windows中運行docker,實際上還是在Windows下先安裝了一個Linux環境,然后在這個系統中運行的docker。也就是說,服務中使用的localhost指的是這個Linux環境的地址,而不是我們的宿主環境Windows。找到這個Linux的ip地址,一般情況下這個地址是192.168.99.100(docker-machine ip default 命令查找)
nginx相關配置
nginx的壓縮輸出配置
# 開啟gzip
gzip on;
# 啟用gzip壓縮的最小文件
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
# gzip 壓縮級別
gzip_comp_level 2;
# 進行壓縮的文件類型。
gzip_types text/plain application/x-javascript application/css text/css application/xml text/javascript application/x-httpd-php
gzip_vary on;
Nginx配置靜態資源跨域訪問
location / {
add_header Access-Control-Allow-Origin http://php.jesse.com; //只允許的域名
add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS; //只允許的方法
root /var/www/php;
index index.html index.htm;
}
Nginx配置靜態資源防盜鏈
location ~ .*\.(jpg|gif|png)$ {
valid_referers none blocked php.jesse.com;
if ($invalid_referer) {
return 403;
}
}
Nginx 靜態資源緩存設置
location ~ .*\.(php|htm|html)$ {
add_header Cache-Control no-cache;
add_header Pragma no-cache;
}
location ~ .*\.(css|js|swf)$ {
add_header Cache-Control max-age=600;
}
location ~ .*\.(jpg|gif|png)$ {
expires 3d;
}
Cache-Control與Expires的作用一致,都是指明當前資源的有效期,控制瀏覽器是否直接從瀏覽器緩存取數據還是重新發請求到服務器取數據。只不過Cache-Control的選擇更多,設置更細致,如果同時設置的話,其優先級高於Expires。
http協議頭Cache-Control
值可以是public、private、no-cache、no- store、no-transform、must-revalidate、proxy-revalidate、max-age
各個消息中的指令含義如下:
- Public 指示響應可被任何緩存區緩存。
- Private 指示對於單個用戶的整個或部分響應消息,不能被共享緩存處理。這允許服務器僅僅描述當用戶的部分響應消息,此響應消息對於其他用戶的請求無效。
- no-cache 告訴瀏覽器、緩存服務器,不管本地副本是否過期,使用資源副本前,一定要到源服務器進行副本有效性校驗。
- no-store 請求和響應消息都不使用緩存。
- max-age 指示客戶機可以接收生存期不大於指定時間(以秒為單位)的響應。
- must-revalidate告訴瀏覽器、緩存服務器,本地副本過期前,可以使用本地副本;本地副本一旦過期,必須去源服務器進行有效性校驗
Nginx 配置SSL及Http跳轉到Https
下面是簡化的創建自簽名證書流程,需要安裝openssl,使用以下步驟:
- 創建Key;
- 創建簽名請求;
- 將Key的口令移除;
- 用Key簽名證書。
生成私鑰
使用openssl工具生成一個RSA私鑰
openssl genrsa -des3 -out server.key 1024
參數說明:生成rsa私鑰,des3算法,1024位強度,server.key是秘鑰文件名。
生成CSR(證書簽名請求)
openssl req -new -key server.key -out server.csr
生成證書簽署請求文件之后,就可以進行證書簽名了,而這個時候可以有兩種選擇。
第一種,就是你把這個CSR文件,發送給權威的CA機構,由他們進行驗證和正式簽名,這種方式簽名后的證書就是得到權威機構進行驗證的,具備有效性,效果就是所有客戶端的瀏覽器都能認可你的證書,但是這種方式是收費的。
第二種,自建CA,自簽證書,意思就是自己給自己簽署證明,很顯然,這種方式的簽署證書,就不能得到權威驗證,無法具備公認的有效性,所以如果客戶端訪問,會顯示證書無效,或者不安全之類的,這種方式是免費的,一般內部測試或者使用的話,用這種方式就可以了。
刪除私鑰中的密碼
在第1步創建私鑰的過程中,由於必須要指定一個密碼。而這個密碼會帶來一個副作用,那就是在每次nginx啟動時,都會要求輸入密碼,這顯然非常不方便。要刪除私鑰中的密碼,操作如下:
openssl rsa -in server.key.org -out server.key
生成自簽名證書
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
原80端口做301轉跳
server {
listen 80;
server_name php.jesse.com;
return 301 https://php.jesse.com$request_uri; #跳轉到Https
}
由於用戶習慣,通常准備訪問某個網站時,在瀏覽器中只會輸入一個域名,而不會在域名前面加上 http:// 或者 https://,而是由瀏覽器自動填充,當前所有瀏覽器默認填充的都是http://。一般情況網站管理員會采用了 301/302 跳轉的方式由 HTTP 跳轉到 HTTPS,但是這個過程總使用到 HTTP 因此容易發生劫持,受到第三方的攻擊。這個時候就需要用到 HSTS(HTTP 嚴格安全傳輸)。
開啟ssl功能
server {
listen 443;
server_name php.jesse.com;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains"; # hsts
root /var/www/php;
index index.html index.htm;
ssl on;
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;
}
制作mynginx鏡像
以上我們在nginx鏡像生成的容器中做了很多操作,也安裝了以下必要的插件。下次使用的時候我們希望是在原來的基礎上操作,我們可以直接使用之前的容器,我們也可以將之前的容器制作成鏡像。
docker commit -a "username" -m "this is mynginx" <container id> mynginx