因为打算将博客从wordpress转到Halo,因此换了台ECS主机,并且需要配置Nginx反向代理,将其中遇到的“坑”记录下
前期准备:
域名解析是把域名指向网站空间IP,让人们通过注册的域名可以方便地访问到网站的一种服务
仅仅域名解析后,我们访问博客时是需要IP+端口才行;但我们平时一般都是指输入网址,并没有输入端口等等,这是因此其中使用了反向代理技术
何为反向代理:
代理服务器是一个中间服务器,它主要是把英特网上的不同客户端的请求转发到不同的服务器上。而反向代理服务器则是代理服务器的一种,它也是把英特网上的不同客户端的请求转发到不同的服务器上,它这些服务器是位于某个私有网络中,且该私有网络具有防火墙(比如防火墙只允许该私有网络通过一个指定的 IP 与 端口与外网连接)。也就是说我们直接访问需要访问的服务器是不通的,这是需要反向代理才行
这里使用的是Nginx来反向代理
Nginx安装
sudo add-apt-repository ppa:nginx/stable
sudo apt-get update
sudo apt-get install nginx
启动并设置开机自启
sudo systemctl start nginx.service
sudo systemctl status nginx.service
sudo systemctl enable nginx.service
如果正常的服务器,这是可以通过浏览器访问IP:80
或者域名:80
;如果出现Welcome to nginx,即说明安装成功
但是的新买的ECS主机的话,需要额外再检查下以下几点:
- 服务器的安全组是否开放443和80端口,这个是ECS管理中做的配置,可参考:阿里云ECS服务器搭建nginx服务访问不了解决办法!!
- 检查服务器系统防火墙是否开放443和80端口,这在服务器中设置,可参考:nginx配置https后,网站出现无法访问情况
对于防火墙开启端口,可用以下方法:
firewall-cmd --permanent --zone=public --add-port=80/tcp
firewall-cmd --permanent --zone=public --add-port=443/tcp
firewall-cmd --reload
# 看下已监听的端口
netstat -tlpn
获取免费的SSL证书
因为我的域名是阿里云的,所以我的SSL证书也是从阿里云上获取,有免费版的,可参考阿里云 SSL 免费证书使用
然后我将.pem
和.key
后缀的两个文件放在了/usr/local/nginx/conf
中,后续Nginx配置时需要用到
Nginx 配置
我的Nginx的配置文件是在:/etc/nginx/nginx.conf
Nginx配置文件常见结构的从外到内依次是「http」「server」「location」等等,缺省的继承关系是从外到内,也就是说内层块会自动获取外层块的值作为缺省值
nginx.conf
是主要的配置文件,但从其代码中可发现,其还include了conf.d
和sites-enabled
目录下的配置文件,如:
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
所以我是将新增的配置放在/etc/nginx/sites-enabled/default
文件中
Nginx配置的写法及其具体含义网上很多,比如可以参考阿里云服务器ecs配置之安装nginx,用到的时候可再查阅下,但是记得要理解!!!不然就要像我一样因为一个小小的用法错误而导致配置失败。。。
我的default
配置文件如下:
server {
listen 443 ssl;
server_name bioinfo-scrounger.com www.bioinfo-scrounger.com;
client_max_body_size 1g;
ssl_certificate "/usr/local/nginx/conf/bioinfo-scrounger.com.pem";
ssl_certificate_key "/usr/local/nginx/conf/bioinfo-scrounger.com.key";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_set_header Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Forwarded-Proto $scheme;
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.0.1:8090/;
}
}
server {
listen 80;
server_name www.bioinfo-scrounger.com;
rewrite ^(.*)$ https://$host$1 permanent;
}
- 由于我要以HTTPS访问网址,因此listen 444和ssl,这里必须要把ssl加上,不然会报错。。。。
- ssl_certificate后面是证书的地址,有pem和key两个文件
- location是用来将url来指定具体的服务,比如我这里要将域名指定到Halo博客的服务(
http://127.0.0.1:8090/
),因此proxy_pass后面接的服务比较重要。。。 - 由于我想将HTTP的请求转发至HTTPS上,所以在
listen 80
后,再rewrite下;这里的写法有很多,可参考Nginx的https配置记录以及http强制跳转到https的方法梳理,都可以尝试下。。。。
修改后,可以用先用nginx -t
检查下语法上是否有误,然后再加载下修改后的配置文件
nginx -s reload
PS. 如果报错:nginx: [error] invalid PID number "" in "/run/nginx.pid"
,只需要再加载前先执行下nginx -c /etc/nginx/nginx.conf
如果报错:端口被占用等信息的话,则将nginx进程kill掉,重新start下即可
最后在浏览器中输入域名即可打开Halo博客了~
参考资料
Nginx配置HTTPS并将HTTP请求重定向到HTTPS
配置域名解析以及Nginx反向代理
Nginx简单操作 | Nginx配置SSL证书
Nginx 入门教程
本文出自于http://www.bioinfo-scrounger.com转载请注明出处