1. 要有安全证书和key文件: *.crt, *.key; 保存在根目录下(位置不重要, 只要绝对路径可以找的到)
2. 修改nginx.conf
#user nginx; #当前用户
worker_processes 1;
events {
worker_connections 1024;
}
http {
proxy_buffer_size 1024k;
proxy_buffers 4 2048k;
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream serverNode {
server 127.0.0.1:8080;
server 127.0.0.2:8080;
}
# HTTPS server
server {
listen 80; # http端口
listen 443 ssl; # https端口
server_name localhost; # 配置的https的域名
ssl_certificate /etc/nginx/ssl.crt; # 证书的crt文件所在目录(如果是阿里云申请的证书,就是*.pem文件)
ssl_certificate_key /etc/nginx/ssl.key; # 证书key文件所在目录(使用绝对路径)
location ~* /https/serverNode {
#proxy_set_header Host $host:30443; #对外映射端口
proxy_pass http://serverNode; #转发后访问的地址
}
}
}
######## 示例2 #########
user nginx;
worker_processes 1;
error_log /var/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 /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
# HTTPS server
server {
listen 80;
listen 443 ssl;
server_name localhost;
ssl_certificate /etc/nginx/ssl.crt;
ssl_certificate_key /etc/nginx/ssl.key;
location / {
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://172.16.11.101:8881;
}
}
}
3. 没有申请安全证书, 自定义一个
3.1 下载OpenSSL: https://www.openssl.org/source/ , 安装: https://www.cnblogs.com/rxbook/p/9367725.html
3.2 (nginx目录下执行命令)
# *.crt *.key C:国家代码 ST:省 L:市 O:组织名称 OU:组织单位名称 CN:域名
$ openssl req -new -newkey rsa:2048 -sha256 -nodes -out ssl.crt -keyout ssl.key -subj "/C=CN/ST=js/L=nanjing/O=sss/OU=ssl/CN=ssl.com"
或者
# 生成一个RSA密钥 (这里需要输入密码,不小于4位)
$ openssl genrsa -des3 -out ssl.key 1024
$ cp ssl.key ssl.key.org
# 拷贝一个不需要输入密码的密钥文件(这里会验证密码, 就是上面命令输入的密码)
$ openssl rsa -in ssl.key.org -out ssl.key
# 生成一个证书请求(这里需要输入一些信息, 除了国家Country Name和域名Common Name其它可以随便写)
$ openssl req -new -key ssl.key -out ssl.csr
# 自己签发证书
$ openssl x509 -trustout -req -days 365 -in ssl.csr -signkey ssl.key -out ssl.crt
#没有-trustout,重启nignx可能会报:cannot load certificate "/etc/nginx/ssl.crt": PEM_read_bio_X509_AUX() failed (SSL: error:0909006C:PEM routines:get_name:no start line:Expecting: TRUSTED CERTIFICATE)
执行完就会得到安全证书了.
# docker 环境下
# 拉取nginx镜像, 以nginx-1为容器名启动, 映射80和443端口
$ docker pull nginx
$ docker run --name nginx-1 -p 3080:80 -p 30443:443 -d nginx
# -- 生成安全证书 --
$ docker cp ssl.key nginx-1:/etc/nginx/ssl.key
$ docker cp ssl.crt nginx-1:/etc/nginx/ssl.crt
# 编辑配置文件, 覆盖nginx默认配置文件
$ vi nginx.conf
$ docker cp nginx.conf nginx-1:/etc/nginx/nginx.conf
# 进入容器, 重新加载配置文件
$ docker exec -it nginx-1 bash
$ cd /etc/nginx
$ nginx -s reload
# -- 退出, 测试 --
4. nginx安装地址和安全证书域名不一致问题
Windows下:
修改 C:\Windows\System32\drivers\etc\hosts 文件
# Copyright (c) 1993-2009 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
# localhost name resolution is handled within DNS itself.
# 127.0.0.1 localhost
0.0.0.0 account.jetbrains.com
# ::1 localhost
# 最后一行追加 本地ip 安全证书域名
127.0.0.1 www.baidu.com
Linux下:
$ vim /etc/hosts
# 最后一行追加 本地ip 安全证书域名
127.0.0.1 www.baidu.com
# 或 hostnamectl set-hostname 安全证书域名
$ hostnamectl set-hostname www.baidu.com
# 设置后可以用 hostname 查看域名
注: 1. hosts文件 一行里有且仅有一个ip; 一个ip后面可以加无数个域名; 多行ip对应一个域名时, 按第一个ip解析.
2. 域名需要注意的地方: hosts文件, nginx.conf文件, 安全证书绑定;
3. nginx默认配置文件有一行include引入其它配置文件, 小心冲突;
4. 转发的地址不要用127.0.0.1或localhost;