docker搭建前后端分离项目通过Nginx部署https到外网服务器
一:项目准备:
1、安装docker和docker-compose(项目通过docker部署)
2、项目在内网能部署成功
3、编写好docker-compose文件,进行docker登录
二:实施
1、docker-compose create;docker-compose start 启动项目
2、权限问题:部署完成后,无法连接数据库是因为服务器的端口没有打开(默认3306端口),一次可以把需要用到的端口打开,(怎么打开,百度了解)。
3、端口打开后,可以使用工具Navicat for mysql连接数据库,将本地数据库的表复制到外网数据库中(也可以使用其他方法,比如copy数据库放到数据库目录下,不过,不建议);并且查看数据库账号的权限。
4、创建网络,docker network xxxxxx;进入docker容器,docker exec -it 容器名 bash; 查看容器的IP,docker inspect (容器名)。
5、部署到外网,需要域名,所以,
第一步要申请一个域名,跳转到阿里云服务器,找到域名...,选择解析(这些可以去百度,都是有的,不详细说)
域名服务器如何绑定:https://blog.csdn.net/rentian1/article/details/95593787
域名如何加入前缀:https://jingyan.baidu.com/article/f71d60373687ba5ab641d1fa.html
6、如何让http变成https,操作起来算简单,就是生成证书,把证书添加到服务器内;其实https=http+ssl;httpshui会对报文进行加密,(做过https的接口测试应该就知道,你直接访问是报错的,需要你上传一个证书的);详细可了解https://segmentfault.com/a/1190000018992153
证书生成:https://freessl.cn/(好像免费证书只能持续90天)
7、在服务器控制台中操作,最后就生成证书
8、配置Nginx
不懂的可以留言问,建议自己多尝试几波,毕竟有万能的百度
user nginx;
worker_processes 1;
error_log /data/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /data/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
server {
listen 80;
server_name 前端域名;
location /{
#此处配置的域名必须与upstream的域名一致,才能转发。
proxy_pass http://容器名:80;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 5;
proxy_read_timeout 60;
proxy_send_timeout 5;
#auth_basic "Restricted";
#auth_basic_user_file htpasswd;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 443 ssl;
server_name 前端域名;
#ssl on;
root html;
index index.html index.htm;
ssl_certificate /etc/nginx/cert/yq_chain.crt; 证书
ssl_certificate_key /etc/nginx/cert/yq_key.key; 证书
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
proxy_set_header Host 前端域名;
proxy_pass http://容器名:80;
#proxy_intercept_errors on;
#error_page 301 302 307 = @handle_redirect;
}
}
server {
listen 80;
server_name 后台域名;
location /{
#此处配置的域名必须与upstream的域名一致,才能转发。
proxy_pass http://容器名:8080;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 5;
proxy_read_timeout 60;
proxy_send_timeout 5;
#auth_basic "Restricted";
#auth_basic_user_file htpasswd;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 443 ssl;
server_name 后台域名;
#ssl on;
root html;
index index.html index.htm;
ssl_certificate /etc/nginx/cert/yqs_chain.crt;
ssl_certificate_key /etc/nginx/cert/yqs_key.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
proxy_set_header Host 后端域名;
proxy_pass http://容器名:8080;
#proxy_intercept_errors on;
#error_page 301 302 307 = @handle_redirect;
}
}
}
9、输入前端域名即可访问,说明搭建成功。