nginx+tomcat+ssl

    xiaoxiao2021-03-25  133

    申请免费的SSL证书

    目前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对于静态内容的处理能力非常强,跟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"/>
    转载请注明原文地址: https://ju.6miu.com/read-17680.html

    最新回复(0)