目前SSL证书大部分都是要收费的。对于企业网站,建议还是花点钱买个安心吧,而对于个人网站,可以选择免费的Let's encrypt。
安装SSL证书的过程并不复杂,第一步是申请证书,第二步是在Nginx中配置证书路径。
(1)安装certbot工具
yum install epel-release
yum install certbot
这个工具会在 你的网站根目录(也就是/usr/local/nginx/html)/.well-known 生成特殊的文件,在申请证书时,Let's Encrypt 服务会通过 http 来访问此文件,以签证服务器,所以在使用 certbot 获取证书之前,你要确保可以浏览器中能够通过http正常访问服务器。
(2)申请证书
certbot certonly -a webroot --webroot-path=/usr/local/nginx/html -d xxx.com -d www.xxx.com
这里的--webroot-path指定网站的根目录,使用-d来指定应用证书的域名,如果有多个,使用多个-d就可以(一般至少应该两个,一个没有www、一个有www)。最终会在 /etc/letsencrypt/live/xxx.com 下,生成四个 PEM 文件
cert.pem: 域名证书
chain.pem:Let's Enctrypt chain certificate
fullchain.pem:cert.pem 和 chain.pem 组成
privkey.pem:证书的私钥
我们需要用到的是后面的两个:fullchain.pem和privkey.pem
(3)在Nginx中应用证书
这一步见下一部分的具体配置。
(4)配置自动更新证书
因为 Let's Encrypt 的证书有效期是90天,到期前要更新证书。certbot 提供了更新证书的命令 cerbot renew。添加一个 conb job 来实现自动更新
crontab -e
输入
30 2 * * 1 /usr/bin/certbot renew >> /var/log/le-renew.log
35 2 * * 1 /usr/bin/systemctl reload nginx
保存即可创建 cron job。以后每周1的凌晨2点30自动更新证书,2点35自动重启nginx。 终极配置之前先看一下我画的一个图(个人理解)Nginx对于静态内容的处理能力非常强,跟Tomcat整合我们一般会将静态资源交给Nginx来处理,同时,考虑到我们会使用静态化技术来将页面转为html并会用到文件上传功能,所以,我们要将Nginx目录的权限也交给tomcat用户,以便其可以正常将文件写入到/usr/local/nginx/html目录下。
chown -R tomcat:tomcat /usr/local/nginx
修改/usr/local/nginx/conf/nginx.conf,内容如下,我已经在要关注的地方进行了说明。这个配置主要实现了以下几项功能:
(1)与Tomcat服务器整合(支持集群)
(2)支持ssl,对特定目录强制使用https协议,其他目录则可以分别使用两种协议
(3)与php整合,对phpMyAdmin增加多一重auth basic验证
user root; #user nobody; worker_processes 1; error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; pid logs/nginx.pid; events { worker_connections 1024; } http { include 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; types_hash_max_size 2048; #注意这里我们包含了一个proxy.conf文件,该文件也是位于/usr/local/nginx/conf目录, include proxy.conf; #下面这堆配置主要用来限制并发连接数,以及压缩内容节省带宽 limit_conn_zone $binary_remote_addr zone=addr:10m; sendfile on; tcp_nopush on; keepalive_timeout 65; gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.0; gzip_comp_level 2; gzip_types text/plain application/x-javascript text/css application/xml; gzip_vary on; server { listen 80; server_name yaofuqiang.cn www.yaofuqiang.cn; location /{ return 307 https://www.yaofuqiang.cn; } } server { listen 80; server_name game.yaofuqiang.cn; location /{ return 307 https://game.yaofuqiang.cn; } } server { listen 80; server_name blog.yaofuqiang.cn; location /{ return 307 https://blog.yaofuqiang.cn; } } #监听https协议(默认443端口) server { listen 443 ssl; server_name www.yaofuqiang.cn; server_tokens off; charset utf-8; #限制并发连接数,这里的“addr”是在前面的“ limit_conn_zone”中定义的,名称要保持一致 limit_conn addr 5; #只允许我们的域名访问 if ($host !~ ^(yaofuqiang.cn|www.yaofuqiang.cn)$ ) { return 444; } #屏蔽非法请求类型 if ($request_method !~ ^(GET|HEAD|POST)$ ) { return 444; } #拒绝异常的User-Agents if ($http_user_agent ~* LWP::Simple|BBBike|wget) { return 403; } if ($http_user_agent ~* Sosospider|YodaoBot) { return 403; } #设置网站根目录 root /usr/local/tomcat/web_index/ROOT; #设置默认首页 index index.html index.htm index.php; include /etc/nginx/default.d/*.conf; #配置ssl证书 ssl_certificate /etc/letsencrypt/live/yaofuqiang.cn/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/yaofuqiang.cn/privkey.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH'; #静态请求 location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ { root /usr/local/tomcat/web_index/ROOT; expires 30d; } #admin目录转交Tomcat处理 location ~ /admin/ { proxy_pass http://139.199.211.49:8080; } #动态请求 location ~ \.(do|jsp|action|jspx|shtml)$ { proxy_pass http://139.199.211.49:8080; 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; client_max_body_size 10m; #允许客户端请求的最大单文件字节数 client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数 proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间 proxy_read_timeout 90; #连接成功后,后端服务器响应时间 proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小 proxy_buffers 6 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置 proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2) proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传 } #phpMyAdmin目录转交php处理 location ~ /phpMyAdmin/ { fastcgi_index index.php; location ~ .*\.(php|php5)?$ { #这里的9000端口是在/etc/php.ini中配置的,9000是默认值,你也可以修改 fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } #/配置auth_basic验证 auth_basic "security"; #密码保存在哪里 auth_basic_user_file /usr/local/nginx/conf/passwd; } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } server { listen 443 ssl; server_name game.yaofuqiang.cn; server_tokens off; charset utf-8; #限制并发连接数,这里的“addr”是在前面的“ limit_conn_zone”中定义的,名称要保持一致 limit_conn addr 5; #只允许我们的域名访问 if ($host !~ ^(game.yaofuqiang.cn)$ ) { return 444; } #屏蔽非法请求类型 if ($request_method !~ ^(GET|HEAD|POST)$ ) { return 444; } #拒绝异常的User-Agents if ($http_user_agent ~* LWP::Simple|BBBike|wget) { return 403; } if ($http_user_agent ~* Sosospider|YodaoBot) { return 403; } #设置网站根目录 root /usr/local/tomcat/web_game/ROOT; #设置默认首页 index index.html index.htm index.php; include /etc/nginx/default.d/*.conf; #配置ssl证书 ssl_certificate /etc/letsencrypt/live/game.yaofuqiang.cn/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/game.yaofuqiang.cn/privkey.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH'; #静态请求 location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ { root /usr/local/tomcat/web_game/ROOT; expires 30d; } #admin目录转交Tomcat处理 location ~ /admin/ { proxy_pass http://139.199.211.49:8081; } #动态请求 location ~ \.(do|jsp|action|jspx|shtml)$ { proxy_pass http://139.199.211.49:8081; 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; client_max_body_size 10m; #允许客户端请求的最大单文件字节数 client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数 proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间 proxy_read_timeout 90; #连接成功后,后端服务器响应时间 proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小 proxy_buffers 6 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置 proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2) proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传 } #phpMyAdmin目录转交php处理 location ~ /phpMyAdmin/ { fastcgi_index index.php; location ~ .*\.(php|php5)?$ { #这里的9000端口是在/etc/php.ini中配置的,9000是默认值,你也可以修改 fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } #/配置auth_basic验证 auth_basic "security"; #密码保存在哪里 auth_basic_user_file /usr/local/nginx/conf/passwd; } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } server { listen 443 ssl; server_name blog.yaofuqiang.cn; server_tokens off; charset utf-8; #限制并发连接数,这里的“addr”是在前面的“ limit_conn_zone”中定义的,名称要保持一致 limit_conn addr 5; #只允许我们的域名访问 if ($host !~ ^(blog.yaofuqiang.cn)$ ) { return 444; } #屏蔽非法请求类型 if ($request_method !~ ^(GET|HEAD|POST)$ ) { return 444; } #拒绝异常的User-Agents if ($http_user_agent ~* LWP::Simple|BBBike|wget) { return 403; } if ($http_user_agent ~* Sosospider|YodaoBot) { return 403; } #设置网站根目录 root /usr/local/tomcat/web_blog/ROOT; #设置默认首页 index index.html index.htm index.php; include /etc/nginx/default.d/*.conf; #配置ssl证书 ssl_certificate /etc/letsencrypt/live/blog.yaofuqiang.cn/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/blog.yaofuqiang.cn/privkey.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH'; #静态请求 location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ { root /usr/local/tomcat/web_blog/ROOT; expires 30d; } #admin目录转交Tomcat处理 location ~ /admin/ { proxy_pass http://139.199.211.49:8082; } #动态请求 location ~ \.(do|jsp|action|jspx|shtml)$ { proxy_pass http://139.199.211.49:8082; 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; client_max_body_size 10m; #允许客户端请求的最大单文件字节数 client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数 proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间 proxy_read_timeout 90; #连接成功后,后端服务器响应时间 proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小 proxy_buffers 6 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置 proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2) proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传 } #phpMyAdmin目录转交php处理 location ~ /phpMyAdmin/ { fastcgi_index index.php; location ~ .*\.(php|php5)?$ { #这里的9000端口是在/etc/php.ini中配置的,9000是默认值,你也可以修改 fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } #/配置auth_basic验证 auth_basic "security"; #密码保存在哪里 auth_basic_user_file /usr/local/nginx/conf/passwd; } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } }上面的配置文件中我们还调用了两个配置文件:proxy.conf、passwd。
proxy.conf的内容如下:
proxy_redirect off; #代理重定向关闭
proxy_set_header Host $host; #从header头中获取的主机名
proxy_set_header X-Real-IP $remote_addr;#获取header头中获取的主机的真实IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #获取header头中获取代理者的真实ip
proxy_set_header X-Forwarded-Proto $scheme;
server_names_hash_bucket_size 128;
large_client_header_buffers 4 32k; #设置请求缓存
client_header_buffer_size 64k; #客户端上传文件缓存大小
client_max_body_size 300m; #设置客户端能够上传文件大小
client_body_buffer_size 512k;
proxy_connect_timeout 60; #跟后台服务器连接超时时间发起握手等待响应超时时间
proxy_send_timeout 90; #后台服务器数据回传时间,就是在规定时间内后端服务器必须传完所有数据
proxy_read_timeout 90; #连接成功后,等待服务器响应时间,其实已经进入后端的排队之中等待处理
proxy_buffer_size 16k; #设置请求缓存区,这个缓存区会保存用户的头信息,以供nginx进行规则处理,一般只要能保存下头信息即可
proxy_buffers 4 64k; #告诉nginx保留单个用到几个Buffer最大用多少空间
proxy_busy_buffers_size 128k; #代理忙碌时使用的缓冲区大小
proxy_temp_file_write_size 128k;#缓存临时文件的大小
而passwd文件则要通过命令来生成:
printf "admin:$(openssl passwd -crypt admin888)\n" >>/usr/local/nginx/conf/passwd
上面的admin是用户名、admin888是密码。当我们访问http://xxx.com/phpMyAdmin的时候,将会先弹出以下提示,然后才进入正常的登陆界面。除了配置Nginx外,我们还要配置Tomcat。
打开/usr/local/tomcat/conf/server.xml,在 <Host name="localhost"……>节增加如下内容:
<Valve className="org.apache.catalina.valves.RemoteIpValve" remoteIpHeader="X-Forwarded-For" protocolHeader="X-Forwarded-Proto" protocolHeaderHttpsValue="https"/>