centos安装Nginx并配置https转发

导言

通过使用nginx来部署https是一种方便的方式。本文是一个自己部署https的笔记

安装Nginx

在Centos的默认镜像中不包含nginx,我们需要添加一个EPEL (extra packages for Enterprise Linux) repository

1
sudo yum install epel-release

然后运行yum 安装

1
sudo yum install nginx

安装好之后可以通过service命令来控制nginx的启动

1
2
3
4
sudo systemctl start nginx # 启动
sudo systemctl stop nginx # 关闭
sudo systemctl restart nginx # 重启
systemctl status nginx # 检查状态

最好启动开机自启动

1
sudo systemctl enable nginx

启动之后默认挂载在80端口,https是挂载在443端口,需要检查一下防火墙是否对这些端口进行了封锁。
如果系统使用的是firewalld 请使用下列的命令

1
2
3
sudo firewall-cmd --add-service=http
sudo firewall-cmd --add-service=https
sudo firewall-cmd --runtime-to-permanent

如果是用的iptables 那就用下列的命令

1
2
sudo iptables -I INPUT -p tcp -m tcp --dport 80 -j ACCEPT
sudo iptables -I INPUT -p tcp -m tcp --dport 443 -j ACCEPT

然后访问对应的ip就可以看到nginx的默认页面了

创建证书

证书的申请我不讲了,有很多方法。根据实际情况看下资料就好了。

https 的证书包含一个private,public两个部分。我们分别建立两个文件夹来存放他们

/etc/ssl/certs 存放公钥的*.crt*.pem 两种文件
/etc/ssl/private 存放公钥的*.key文件

1
2
3
4
5
sudo mkdir /etc/ssl/private
sudo chmod 700 /etc/ssl/private

sudo mkdir /etc/ssl/certs
sudo chmod 700 /etc/ssl/certs

配置nginx的Https

nginx在默认情况下是没有启动https的,所以我们需要新建一个配置文件用来描述https
我们需要再/etc/nginx/conf.d/下创建一个.conf结尾的文件,nginx在启动的时候会默认加载conf.d下以.conf结尾的配置文件。
我们创建一个ssl的配置文件

1
sudo vi /etc/nginx/conf.d/ssl.conf

默认情况下的https端口是443端口,server_name是你申请的域名,或者ip。

然后再加入以下对于https的描述性配置,就完成了nginx的配置了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
server {
listen 443 http2 ssl;
listen [::]:443 http2 ssl;

server_name server_IP_address;

ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
ssl_dhparam /etc/ssl/certs/dhparam.pem;

########################################################################
# from https://cipherli.st/ #
# and https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html #
########################################################################

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# Disable preloading HSTS for now. You can use the commented out header line that includes
# the "preload" directive if you understand the implications.
#add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;

##################################
# END https://cipherli.st/ BLOCK #
##################################

root /usr/share/nginx/html;

location / {
}

error_page 404 /404.html;
location = /404.html {
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}

配置nginx的转发

通常我们都是将自己的本地服务器,放在内网,通过nginx来映射服务。nginx配置接口转发相当方便只需要在上面的配置最后加上一个

1
2
3
4
5
6
7
location /api/ {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:4399/;
}

其中的4399 就是本地服务器的端口号了。
可以将多个本地的路径映射到不同的服务器上