前言
作为一名“优秀”的java程序员,不仅仅要会敲代码,一定要上得厅堂,下得厨房。服务器也能搞一搞。所以,搞个网站玩玩。本篇主要是讲怎么安装Nginx以及如何配置https。
一、服务器和域名
我买的阿里云的服务器和域名,年龄在24之前是学生价,一百来块钱就能搞个服务器,域名1块钱一年。其实也可以买国外的服务器,可能便宜点,另外买国外的域名不需要备案。花1块钱买了个域名,用了半个多月的时间来备案,真的是麻烦死了。万事俱备,只欠东风了。
二、Nginx
Nginx是啥我就不说了,为了更加安全,我打算搭建https化的网站,所以就需要SSL证书。放心,阿里云提供免费的SSL证书。首先我们安装nginx。
1、新建nginx文件夹
cd /usr/local && mkdir nginx
2、进入nginx文件夹,wget 下载nginx压缩包
cd nginx
3、解压
tar -zxvf nginx-1.14.1.tar.gz
4、安装所需要的依赖:
yum install -y gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel
5、进行configure配置:一定要配置 --with-http_ssl_module,这是开启SSL。
cd nginx-1.14.1 && ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
6、编译安装,是在解压的目录下
make && make install
7、上传证书文件
在阿里云下载Nginx版本的证书,没有的话可以免费申请,但是你要有一个域名。
阿里云管理控制台---->域名列表---->管理---->免费开启SSL证书----->单域名免费证书
新建一个文件夹用来存放证书文件,随便起名字,且要控制访问权限。
在conf文件夹下新建一个cert文件夹,把证书上传到该文件加下,域名以domain.com为例
7、配置,编辑 /usr/local/nginx/conf下的nginx.conf配置文件
vim /usr/local/nginx/conf/nginx.conf
取消https部分的注释,编辑如下,部分内容修改成自己的配置即可。
upstream server{
ip_hash;
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
server {
listen 443 ssl;
server_name www.domain.com;
ssl_certificate cert/www/domain.com.pem;
ssl_certificate_key cert/www.doamin.com.key;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
# 限制外网访问内网 actuator 相关路径
location ~ ^(/[^/]*)?/actuator(/.*)?$ {
return 403;
}
location / {
root html;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
location /prod-api/ {
proxy_set_header Host $http_host;
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://server/;
}
}
为了配置全部https的访问,可以将80端口的访问请求全部转发到443端口上。
server {
listen 80;
server_name www.domain.com;
#将所有http请求通过rewrite重定向到https
rewrite ^(.*)$ https://$host$1 permanent;
}
8、启动
/usr/local/nginx/sbin/nginx
谷歌浏览器访问你的域名,右上角如果出现绿色小锁和安全字样,就说明配置正确了。
9、其他命令
停止 /usr/local/nginx/sbin/nginc -s stop
重启 /usr/local/nginx/sbin/nginx -s reload
10、设置为全局命令
ln -s /usr/local/nginx/sbin/nginx /usr/sbin/nginx
11、每个域名一个配置文件
在nginx.conf配置文件的http模块下添加inclue语句
include /usr/local/nginx/conf/conf.d/*.conf;
在nginx.cof配置文件的同级目录新建conf.d目录
cd /usr/local/nginx/conf
mkdir conf.d
在conf.d目录中新增一个域名配置文件,例如域名是demo.com,则新增demo.com.conf
vim demo.com.conf
server {
listen 80;
server_name www.domain.com;
#将所有http请求通过rewrite重定向到https
rewrite ^(.*)$ https://$host$1 permanent;
}
upstream server{
ip_hash;
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
server {
listen 443 ssl;
server_name www.domain.com;
ssl_certificate cert/www/domain.com.pem;
ssl_certificate_key cert/www.doamin.com.key;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
# 限制外网访问内网 actuator 相关路径
location ~ ^(/[^/]*)?/actuator(/.*)?$ {
return 403;
}
location / {
root html;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
location /prod-api/ {
proxy_set_header Host $http_host;
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://server/;
}
}
三、添加到系统服务
vim /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
LimitNOFILE=1000000
LimitNPROC=1000000
LimitCORE=1000000
[Install]
WantedBy=multi-user.target
systemctl start|stop|reload|restart|status nginx.service
开机自启:
systemctl enable nginx.service
关闭开机自启:
systemctl disable nginx.service
四、自签证书
新建证书生成脚本文件gencert.sh,添加以下内容
vim gencert.sh
#!/bin/sh
# create self-signed server certificate:
read -p "Enter your domain [www.example.com]: " DOMAIN
echo "Create server key..."
openssl genrsa -des3 -out $DOMAIN.key 1024
echo "Create server certificate signing request..."
SUBJECT="/C=US/ST=Mars/L=iTranswarp/O=iTranswarp/OU=iTranswarp/CN=$DOMAIN"
openssl req -new -subj $SUBJECT -key $DOMAIN.key -out $DOMAIN.csr
echo "Remove password..."
mv $DOMAIN.key $DOMAIN.origin.key
openssl rsa -in $DOMAIN.origin.key -out $DOMAIN.key
echo "Sign SSL certificate..."
openssl x509 -req -days 3650 -in $DOMAIN.csr -signkey $DOMAIN.key -out $DOMAIN.crt
echo "TODO:"
echo "Copy $DOMAIN.crt to /etc/nginx/ssl/$DOMAIN.crt"
echo "Copy $DOMAIN.key to /etc/nginx/ssl/$DOMAIN.key"
echo "Add configuration in nginx:"
echo "server {"
echo " ..."
echo " listen 443 ssl;"
echo " ssl_certificate /etc/nginx/ssl/$DOMAIN.crt;"
echo " ssl_certificate_key /etc/nginx/ssl/$DOMAIN.key;"
echo "}"
执行脚本
./gencert.sh
内网没有域名的话,域名输入地方填写ip就可以
然后会生成四个文件
- domain.crt:自签名的证书
- domai.csr:证书的请求
- domai.key:不带口令的Key
- domai.origin.key:带口令的Key
在nginx的server中配置即可
server {
...
ssl on;
ssl_certificate /etc/nginx/ssl/dmain.crt;
ssl_certificate_key /etc/nginx/ssl/domain.key;
}