前言
作为一名“优秀”的java程序员,不仅仅要会敲代码,一定要上得厅堂,下得厨房。服务器也能搞一搞。所以,搞个网站玩玩。本篇主要是讲怎么安装Nginx以及如何配置https。
一、服务器和域名
我买的阿里云的服务器和域名,年龄在24之前是学生价,一百来块钱就能搞个服务器,域名1块钱一年。其实也可以买国外的服务器,可能便宜点,另外买国外的域名不需要备案。花1块钱买了个域名,用了半个多月的时间来备案,真的是麻烦死了。万事俱备,只欠东风了。
二、Nginx
Nginx是啥我就不说了,为了更加安全,我打算搭建https化的网站,所以就需要SSL证书。放心,阿里云提供免费的SSL证书。首先我们安装nginx。
1、新建servers文件夹
cd /usr/local && mkdir servers
2、进入servers文件夹,wget 下载nginx压缩包
cd servers
3、解压
tar -zxvf nginx-1.14.1.tar.gz
4、安装所需要的依赖:
yum install -y gcc
yum install -y pcre
yum install -y pcre-devel
yum install -y zlib
yum install -y zlib-devel
yum install -y openssl openssl-devel
5、进行configure配置:一定要配置 --with-http_ssl_module,这是开启SSL。
cd nginx-1.14.1 && ./configure --prefix=/usr/local/servers/nginx --with-http_stub_status_module --with-http_ssl_module
6、编译安装,是在解压的目录下
make && make install
7、上传证书文件
在阿里云下载Nginx版本的证书,没有的话可以免费申请,但是你要有一个域名。
阿里云管理控制台---->域名列表---->管理---->免费开启SSL证书----->单域名免费证书
新建一个文件夹用来存放证书文件,随便起名字,且要控制访问权限。
在conf文件夹下新建一个cert文件夹,把证书上传到该文件加下,域名以domain.com为例
7、配置,编辑 /usr/local/servers/nginx/conf下的nginx.conf配置文件
vi /usr/local/servers/nginx/conf/nginx.conf
取消https部分的注释,编辑如下,部分内容修改成自己的配置即可。
upstream myapp {
server 服务器ip:8080;
}
# HTTPS server
#
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:1m;
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 / {
root html;
index index.html index.htm;
#以下为反向代理至tomcat的配置
# proxy_pass http://myapp;
# proxy_redirect off;
# proxy_set_header Host $host;
# proxy_set_header X-Real-IP $remote_addr;
}
location = / {
root html;
index index.html index.htm;
}
}
为了配置全部https的访问,可以将80端口的访问请求全部转发到443端口上。
server {
listen 80;
server_name www.domain.com;
#charset koi8-r;
#access_log logs/host.access.log main;
rewrite ^(.*)$ https://$host$1 permanent; #将所有http请求通过rewrite重定向到https。
location / {
root html;
index index.html index.htm;
}
}
8、启动
/usr/local/servers/nginx/sbin/nginx
谷歌浏览器访问你的域名,右上角如果出现绿色小锁和安全字样,就说明配置正确了。
9、其他命令
停止 /usr/local/servers/nginx/sbin/nginc -s stop
重启 /usr/local/servers/nginx/sbin/nginx -s reload
三、添加到系统服务
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;
}