如何安装Nginx参考:
需求:
Docker Nginx环境,为www.beimapro.com和api.beimapro.com配置https安全证书。当访问www.beimapro.com时自动跳转到https://www.beimapro.com
实现:
我这里使用的是UCloud的云服务器,阿里云、腾讯云也类似,关于域名或云服务器如何购买,如何配置,这里略过。
nginx目录结构为:
为了配置简洁与方便维护,把不同的域名单独新建.conf文件。通过nginx.conf加载conf.d下所有后缀为*.conf的文件,如下图:
其中,api.beimapro.com为接口程序的nginx配置,www.beimapro.com为某科技公司官网的nginx配置。如下图:
通过在平台购买的域名,可申请免费的https证书,有效期一年。申请下来后得到两个证书,分别为: public.pem和private.key。把它上传到服务器上,注意要上传到nginx映射的路径。
官网:www.beimapro.com.conf,写两个server,分别监听80端口和443端口,配置如下:
server {
listen 80;
server_name localhost www.beimapro.com beimapro.com;
rewrite ^(.*) https:$host$1 permanent; #访问80端口自动跳转443端口
location / {
root /usr/share/nginx/html/website; #这里要写docker中的地址
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
server {
listen 443;
server_name localhost www.beimapro.com beimapro.com;
ssl on; #开启ssl
ssl_certificate /usr/share/nginx/html/https/www/public.pem; #注意地址路径
ssl_certificate_key /usr/share/nginx/html/https/www/private.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配
location / {
root /usr/share/nginx/html/website;
index index.html index.htm;
}
}
接口api.beimapro.com.conf配置一个server,配置如下:
server {
listen 80;
listen 443 ssl; #开启443
server_name api.beimapro.com;
#rewrite ^(.*) https:$host$1 permanent;
ssl_certificate /usr/share/nginx/html/https/api/public.pem;
ssl_certificate_key /usr/share/nginx/html/https/api/private.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配
location / {
root /usr/share/nginx/html;
index index.html index.htm;
#autoindex on;
#try_files $uri /index/index/page.html;
#try_files $uri /index/map/page.html;
# 允许跨域请求的“域”
add_header 'Access-Control-Allow-Origin' $http_origin;
# 允许客户端提交Cookie
add_header 'Access-Control-Allow-Credentials' 'true';
# 允许客户端的请求方法
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, DELETE, PUT';
# 允许客户端提交的的请求头
add_header 'Access-Control-Allow-Headers' 'Origin, x-requested-with, Content-Type, Accept, Authorization';
# 允许客户端访问的响应头
add_header 'Access-Control-Expose-Headers' 'Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma';
# 处理预检请求
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain; charset=utf-8';
add_header 'Content-Length' 0;
return 204;
}
}
#以下为内部跳转
# 认证服务
location /baidu-auth-server {
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.2.1:10001/;
}
# CSS服务
location /baidu-css-server {
#root html;
#index index.html index.htm;
proxy_set_header Host $host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.2.2:10002/;
}
# 聊天服务
location /baidu-css-webchat-service {
#root html;
proxy_set_header Host $host;
proxy_redirect off;
proxy_pass http://127.0.2.3:10003/;
}
#对外API
location /baidu-css-api {
#root html;
#index index.html index.htm;
proxy_set_header Host $host;
proxy_redirect off;
proxy_pass http://127.0.2.4:10004/;
}
}
常见问题:
- 域名不管是一级还是二级域名均需要单独申请证书。
- 若配置完成且启动nginx无异常仍然无法使用https访问时,请检查docker是否开放443端口。
- 通过 lsof -i:443 查看是否有443进程,若无说明https没有开启或生效。或通过telnet 127.0.0.1 443 查看是否OK。
- 配置完成后记得docker restart nginx重启nginx以及docker logs -f nginx查看配置是否有异常。
- 要注意你的nginx是否安装SSL模块,Docker通过docker exec -it nginx bash 进入到nginx执行nginx -V查看,若不是Docker安装的Nginx则进入到sbin目录执行./nginx -V查看,如下图:
最终效果:
官网:访问www.beimapro.com会自动跳转到https://www.beimapro.com
API:访问api.beimapro.com时不会自动跳转到https://api.beimapro.com,均可单独访问。