Nginx安装安全证书!在Nginx中配置HTTPS的详细分析说明

783 阅读5分钟

这是我参与11月更文挑战的第25天,活动详情查看:2021最后一次更文挑战

基本概念

  • Nginx是一款高性能的HTTP和反向代理web服务器,同时提供IMAP,POP3SMTP服务
  • Nginx是一款轻量级的web服务器,反向代理服务器,同时也是IMAP,POP3SMTP电子邮件服务器,在BSD-like协议下运行
  • Nginx的特点是占用内存少,并发能力强
  • Nginx的两个特性:
    • 反向代理
    • 负载均衡
  • Nginx命令:
    • 启动: start nginx
    • 关闭: nginx -s stop
    • 重启: nginx -s reload
  • Nginx使用的是HTTP服务的默认端口80, 所以访问地址不用写端口号
    • 80端口是为超文本传输协议HTTP开放的,因为浏览网页服务默认的端口号都是80, 因此只要输入HTTP地址即可,不需要输入端口号80
  • Nginx使用的端口号在nginx-1.18.0\conf\nginx.conf中配置
  • 使用Nginx配置反向代理域名:
# 设定虚拟主机配置
server {
	# 监听80端口
	listen 80;
	# 定义服务名,通常和域名相同,多个域名使用逗号隔开
	server_name 域名1,域名2;
	# 编码方式
	charset UTF-8;
	# 配置虚拟主机的访问日志
	access_log IP地址;
	# 配置URL映射
	location / {
		# 监听请求转发的端口,也就是服务端口,通过代理实现
		proxy_pass http://127.0.0.1:8888
	}
}

HTTPS证书

  • 安装HTTPS证书的前提是安装好Nginx,Nginx中配置安装HTTPS证书
  • 安装HTTPS证书的两种方式:
    • acme.sh脚本生成
    • 阿里云申请

acme

  • CentOS环境安装acme.sh

安装依赖项

  • 安装acme.sh的主要依赖项socat
yum -q -y install openssl crontabs socat curl
  • 安装acme.sh脚本
curl https://get.acme.sh | sh

生成证书

  • 使用acme.sh生成证书时,会暂时占用80端口.所以需要关闭nginx以释放占用的80端口,并且保证没有其余的进程占用80端口
  • 关闭nginx
cd /usr/local/nginx/sbin/

./nginx -s stop
  • 使用acme.sh生成HTTPS证书
/root/.acme.sh/acme.sh --issue -d 域名 --standalone --keylength ec-256 --force

证书更新

  • 由于Let's Encrypt的证书有效期只有3个月,因此需要90至少更新一次证书
  • acme.sh脚本会每60天自动更新一次证书
  • 可以手动更新证书
/root/.acme.sh/acme.sh --renew -d mydomain.com --force --ecc

安装证书和密钥

  • 新建存储证书的文件夹
mkdir /etc/https/
  • 将证书安装到新建的文件夹
/root/.acme.sh/acme.sh --installcert -d 域名 --ecc \
	--fullchain-file /etc/https/域名.crt \
	--key-file /etc/https/域名.key
  • 完成acme.sh安装HTTPS证书

阿里云

  • 阿里云的免费证书的有效期为1年

获取证书

  • 在阿里云官网申请证书成功后,将证书文件的压缩包下载到本地并解压,包括pem文件和key文件

安装证书

  • nginx的目录新建cert文件夹存放证书文件
cd /usr/local/nginx

mkdir cert
  • 将解压好的pem文件和key文件存放到cert文件夹中

Nginx配置

# 运行用户
user nobody;
# 启动进程,通常设置成和CPU数量相等
worker_process 1;

# 全局错误日志和PID文件
error_log logs/error.log;
error_log logs/error.log notice;
error_log logs/error.log info;
pid logs/niginx.pid;

# 工作模式和连接数上限
events {
	# use epoll;	epoll是多路复用IO,及I/O Multiplexing中的一种方式,仅用于Linux2.6以上的内核,可以大大提高Linux内核的性能
	worker_connections 1024;
	# multi_accept on;
}

# 设定http服务器,利用反向代理功能提供负载均衡支持
http {
	# 设定mime类型,类型由mime.type文件定义
	include /usr/local/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 logs/access.log main;

	# sendfile指令指定nginx是否调用sendfile函数,使用zero copy方式来输出文件. 对于普通应用,必须设置为on;如果是用于下载的等磁盘IO重负载应用,可以设置为off,这样可以平衡磁盘与网络I/O处理速度,降低系统的uptime
	sendfile on;
	# tcp_nopush;

	# 连接超时时间-keepalive_timeout
	# keepalive_timeout 0;
	keepalive_timeout 60;
	tcp_nodelay on;

	# 开启gzip压缩
	gzip on;
	gzip_disable "MSIE [1-6]\.(?!.*SV1)";

	# 设定请求缓冲
	client_header_buffer_size 1k;
	large_client_header_buffers 4 4k;

	include /usr/local/nginx/conf.d/*.conf;
	include /usr/local/nginx/site-enabled/*;
	
	# 端口转发,80端口跳转到443端口
	server {
		listen 80 default_server;
		server_name 域名;
		rewrite ^(.*)$ https://${server_name}$1 permanent;
	}
	server {
		listen 443 ssl;
		ssl_certificate	/etc/https/域名.crt;
		ssl_certificate_key	/etc/https/域名.key;
		ssl_protocols	TLSv1 TLSv1.1 TLSv1.2;
		ssl_ciphers	HIGH:!aNULL:!MD5;
		server_name 域名;
		location / {
		# 定义服务器的默认网站根目录位置
		root /root;
		# 定义首页索引文件的名称
		index index.php index.html index.htm;
		}

		# 定义错误提示页面
		error_page 500 502 503 504 /50x.html;
			location = /50x.html {
				root /root;
		}

		# 静态文件,Nginx处理
		location ~ ^/(images|javascript|js|css|flash|media|static)/ {
			root /var/www/virtual/htdocs;
			# 过期时间为30天
			expired 30d;
		}

		# 设定查看Nginx状态的地址
		location /NginxStatus {
			stub_status on;
			access_log on;
			auth_asic "NginxStatus";
			auth_basic_user_file conf/htpassword;
		}

		# 设定禁止访问.htxx文件
		location ~ /\.ht {
			deny all;
		}
# -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
		# 设定均衡服务器列表
		upstream servers1 {
			# weight参数表示权重,权重越高,被分配到的几率越大
			#本机上的Squid开启3128端口
			server 192.168.8.1x:3128 weight=5;
			server 192.168.8.2x:80 weight=1;
			server 192.168.8.3x:80 weight=6;
		}
		upstream servers2 {
			# weight参数表示权重,权重越高,被分配到的几率越大
			server 192.168.8.x:80 weight=1;
			server 192.168.8.x:80 weight=6;
		}

		# 虚拟服务器
		server {
			# 监听192.168.8.x的80端口
			listen 80;
			server_name 域名;

			# 对aspx后缀的进行负载均衡配置
			location ~.*\.aspx$ {
				# 定义服务器默认网站根目录位置
				root	/root;
				# 定义首页索引文件的名称
				index	index.php index.html index.htm;

				# 设置请求转向servers定义的服务器列表
				proxy_pass http://servers;

				# 反向代理相关配置
				proxy_redirect off;
				# 后端的Web服务器可以通过x_forwarded_for获取用户的真实IP
				proxy_set_header HOST $host;
				proxy_set_header X-Real-IP $remote_addr;
				proxy_set_header X-Forward-For $proxy_add_x_forward_for;
				# 允许客户端请求的最大单文件字节数
				client_max_body_size 10m;
				# 缓存区代理缓冲用户端请求的最大字节数
				client_body_buffer_size 128k;
				# 代理连接超时:Nginx于后端服务器连接超时时间
				proxy_connect_timeout 90;
				# 代理发送超时:后端服务器数据回传时间
				proxy_send_timeout 90;
				# 代理接收超时: 连接成功后,后端服务器响应时间
				proxy_read_timeout 90;
				# 设置代理服务器Nginx保存用户头信息的缓存区大小
				proxy_buffer_size 4k;
				# 设置proxy_buffers缓冲区,网页平均在32k以下
				proxy_buffers 4 32k;
				# 设置高负荷下缓冲大小,通常为proxy_buffers与负载均衡服务器数量倍数
				proxy_busy_bufffers_size 64k;
				# 设置缓存文件夹大小,大于这个值,将会从upstream服务器传
				proxy_temp_file_write_size 64k;
			}
		}
	}	
}
  • 完成Nginx安装HTTPS证书配置