Nginx+Tomcat+Java+PHP+MySQL+SSL
本文将先容Linux环境下如何安装Web做事根本运行环境,包括以下内容:
安装jdk
安装Tomcat
安装MySQL
安装PHP
安装Nginx
安装SSL证书
整合Nginx和Tomcat
整合完成后,做事器将可以知足大部分运用处景需求。
以下案例利用的做事器是一款美国的VPS,腾讯云、阿里云等云主机搭建过程与之类似。
首先看一下做事器的参数这台做事器内存有1G,利用的是CentOS7 64位系统,可以跑中小型的Java Web程序。特殊提醒,由于目前的项目一样平常都会用到springmvc、mybatis等一堆框架,对内存的花费很大,建议内存最低配置要1G以上。以这台做事器为例,只跑一个运用,由于用了较多的框架,tomcat内存占用已达到277M。
tomcat占用
之前我图省钱选择了768M内存的VPS,创造每隔一段韶光Tomcat就无缘无端shutdown,花了很永劫光排查缘故原由,末了查看系统日志才创造是由于java内存占用过高而被系统 逼迫kill掉。
事前准备由于这台VPS默认的措辞环境是英文,以是须要先切换到中文。
(1)设置措辞
export LANG=\"大众zh_CN.UTF-8\"大众
(2)重新载入
. /etc/profile
(3)检讨修正结果
echo $LANG
此外,由于是美国的做事器,以是还要将系统的韶光改为北京韶光,实行以下命令:
(1)修正日期
date -s 16/02/2017
(2)修正韶光(这里是上午11:35)
date -s 111:35
(3)将时钟写入CMOS,确保重启后依然生效(记得不要漏了这一句)
clock -w
(4)修正时区
cp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
会提示是否覆盖,选Y
安装JDK先检讨一下系统是否已经装了jdk
rpm -qa | grep jdk
某些系统可能安装了openjdk,不过听说这个版本可能兼容性不是很好,你可以看情形选择是否要卸载而重新安装Oracle版本。我这里选择的是卸载后重新安装。
(1)卸载
yum remove java-1.7.0-openjdk
(2)安装Oracle官方的JDK
先要下载rpm安装包,可以在浏览器打开jdk下载页面,右键获取链接。但是目前网页须要进行用户验证(须要你点击accept才能下载),以是wget的时候要加上一些参数来跳过这个检讨
wget --no-check-certificate --no-cookie --header \公众Cookie:oraclelicense=accept-secureback-cookie;\"大众 http://download.oracle.com/otn-pub/java/jdk/8u121-b13/e9e7ea248e2c4826b92b3f075a80e441/jdk-8u121-linux-x64.rpm
(3)直接安装
rpm -ivh jdk-8u121-linux-x64.rpm
系统默认会将jdk安装到这个位置:/usr/java/jdk1.8.0_121
安装TomcatTomcat可以利用yum或者下载安装的办法,我这里采取的是下载安装的办法。
(1)下载压缩包
wget http://www-us.apache.org/dist/tomcat/tomcat-8/v8.5.11/bin/apache-tomcat-8.5.11.tar.gz
(2)解压缩
tar -zxvf apache-tomcat-8.5.11.tar.gz
(3)将apache-tomcat-8.5.11 移动到/usr/local目录下
mv apache-tomcat-8.5.11 /usr/local
(4)将apache-tomcat-8.5.11目录名更名为tomcat
mv /usr/localapache-tomcat-8.5.11 /usr/localtomcat
为了安全起见,我们一样平常会将诸如Tomcat、Nginx等对外供应做事运用的目录权限修正一下。
(1)新建一个tomcat用户组
groupadd tomcat
(2)新建一个tomcat用户并加入tomcat用户组,同时限定该账户无法利用bash
useradd -g tomcat -s /sbin/nologin tomcat
(3)可以利用以下命令查看一下设置结果
id tomcat
(4)将tomcat目录的拥有者改为tomcat,并将目录权限改为770:
chown -R tomcat:tomcat /usr/local/tomcat
chmod -R 770 /usr/local/tomcat
此外,我们一样平常还会设置Tomcat随系统自动启动。
(1)在tomca/bin 目录下面,增加 setenv.sh 配置,catalina.sh会在tomcat启动的时候被调用。
这个文件包含如下两行内容(Java内存参数根据自己做事器配置来修正):
#指定tomcat pid的路径,系统将以此来区分进程
CATALINA_PID=\公众$CATALINA_BASE/tomcat.pid\公众
#增加一些java内存配置参数,并修正一下时区,否则tomcat日志的韶光可能不准确
JAVA_OPTS=\"大众-Xms256m -Xmx512m -Xss1024K -XX:PermSize=64m -XX:MaxPermSize=128m -Duser.timezone=Asia/Shanghai\"大众
(2)添加做事
切换至/usr/lib/systemd/system/目录,建立tomcat.service文件并输入以下内容:
[Unit]
Description=Tomcat
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/tomcat/tomcat.pid
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
User=tomcat
Group=tomcat
[Install]
WantedBy=multi-user.target
(3)设置为开机启动
systemctl enable tomcat
(4)启动、停滞、重启tomcat命令:
#启动tomcat
systemctl start tomcat
#停滞tomcat
systemctl stop tomcat
#重启tomcat
systemctl restart tomcat
#查看tomcat做事状态
systemctl status tomcat.service
systemctl status tomcat.service
如果看到状态为active(running),表明tomcat已经成功启动。不过,这时候你还不能通过http://IP地址:8080来访问tomcat,由于我们还没有开放8080端口。先别急,我们连续往下走。
安装PHP(1)先检讨系统是否已经安装了php及其版本
yum list installed | grep php
(2)如果有安装的PHP包,先删除他们
yum remove php.
(3)配置yum源(可能要试几次才能成功)
rpm -Uvh https://mirror.webtatic.com/yum/el7/epel-release.rpm
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
(4)接着就一次性安装php及干系组件
yum install php56w.x86_64 php56w-cli.x86_64 php56w-common.x86_64 php56w-gd.x86_64 php56w-ldap.x86_64 php56w-mbstring.x86_64 php56w-mcrypt.x86_64 php56w-mysql.x86_64 php56w-pdo.x86_64 php56w-fpm.x86_64
(5)检讨一下php是否安装成功:
由于我们利用的是yum的安装办法,以是已经帮我们配置好干系的service了,直接启动就可以,干系命令:
#启动
systemctl start php-fpm
#重启
systemctl restart php-fpm
#停滞
systemctl stop php-fpm
#设置开机启动php-fpm
systemctl enable php-fpm.service
接下来,我们要对php进行一下配置。
(1)打开php.ini配置文件
vi /etc/php.ini
(2)限定PHP只能操作指定目录下的文件,把稳后面要加斜杠。由于我们会用到Nginx做事器,以是这里我们将PHP目录直接放到Nginx默认的web路径之下(见下文)
open_basedir = /usr/local/nginx/html/
其余还会有很多安全选项可以配置,如allow_url_include、allow_url_fopen、allow_url_include、display_errors等,这些选项在正式环境下建议关闭。不过由于本案例会用到phpMyAdmin这个可视化工具来管理MySQL数据库,以是暂时先保留默认状态。
安装MySQL这台做事器默认安装了MariaDB(MySQL的一个分支),其用法基本跟MySQL同等,但也有眇小差异(如字段大小写问题),由于我在本地开拓的时候用的是MySQL,以是这里我还是换回了MySQL。
(1)卸载MariaDB
检讨系统是否安装了mariadb
rpm -qa | grep mariadb
逼迫卸载
rpm -e –nodeps mariadb-libs-5.5.37-1.el7_0.x86_64
(2)下载mysql的repo源
wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
(3)安装mysql-community-release-el7-5.noarch.rpm包
rpm -ivh mysql-community-release-el7-5.noarch.rpm
安装这个包后,会得到两个mysql的yum repo源:
/etc/yum.repos.d/mysql-community.repo
/etc/yum.repos.d/mysql-community-source.repo
(4)之后就可以利用yum办法安装mysql
yum install mysql-server
(5)设为开机启动并立即启动做事
systemctl enable mysqld
systemctl start mysqld
安装完之后要第一韶光进行安全初始化设置,直接输入mysql_secure_installation
mysql_secure_installation
该指令会勾引你完成初始化操作:
Set root password? [Y/n] <– 回车
New password: <– 输入ROOT密码 // KD020lzb@
Re-enter new password: <– 再输入一次ROOT密码
Remove anonymous users? [Y/n] <– 回车
Disallow root login remotely? [Y/n] <– 回车
Remove test database and access to it? [Y/n] <– 回车
Reload privilege tables now? [Y/n] <– 回车
(6)可以验证一下刚才设置的密码
此外,由于我们数据库会用到中笔墨符集,以是要进行一下相应配置。
(1)修正/etc/my.cnf
vi /etc/my.cnf
在[client]段增加:
default-character-set=utf8
在[mysqld]段增加:
character-set-server=utf8
collation-server=utf8_general_ci
(2)配置完成后要重启做事
systemctl restart mysqld
安装Nginx我利用的是手工安装的办法,你也可以选择yum办法
(1)Nginx的运行须要依赖以下组件,须要先安装
yum install -y gcc-c++
yum install -y pcre pcre-devel
yum install -y zlib zlib-devel
yum install -y openssl openssl-devel
(2)下载安装包
wget -c https://nginx.org/download/nginx-1.10.2.tar.gz
(3)解压
tar -zxvf nginx-1.10.2.tar.gz
(4)进入nginx-1.10.2目录,直接编译安装
./configure
make
make install
默认会安装到/usr/local/nginx目录。
(5)设置开机启动,办法跟tomcat类似
vi /usr/lib/systemd/system/nginx.service
输入以下内容:
[Unit]
Description=nginx - high performance web server
After=network.target remote-fs.target nss-lookup.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
PrivateTmp=true
[Install]
WantedBy=multi-user.target
设置开机启动并立即启动做事
systemctl enable nginx.service
systemctl start nginx.service
开放干系端口在访问运用之前,我们要先在防火墙中开放干系的端口,可以直策应用以下命令:
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload
这时候输入http://IP地址,该当就能够看到Nginx中默认的页面了。不过由于我们没有开放8080端口,以是你不能利用8080端口来访问Tomcat。为什么不开放8080端口呢?由于我们不须要开放,我们走的是Nginx反向代理,Nginx会自动根据配置(见下文)将内容转交给Tomcat处理。
接下来申请SSL证书并对Nginx和Tomcat进行整合。
申请免费的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验证
#把稳改为tomcat
user tomcat;
#根据做事器CPU数量来设
worker_processes 1;
error_log logs/error.log;
#这个pid路径要跟/usr/lib/systemd/system/nginx.service中的保持同等
pid logs/nginx.pid;
events {
use epoll;
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;
sendfile on;
tcp_nopush on;
keepalive_timeout 65;
types_hash_max_size 2048;
#把稳这里我们包含了一个proxy.conf文件,该文件也是位于/usr/local/nginx/conf目录,下文会讲
include proxy.conf;
#下面这堆配置紧张用来限定并发连接数,以及压缩内容节省带宽
limit_conn_zone $binary_remote_addr zone=addr:10m;
gzip on;
gzip_min_length 1000;
gzip_comp_level 4;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
open_file_cache max=655350 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
#定义Tomcat做事器的位置,包括端口、权重。如果要配置集群,可以在个中增加多个server,只要将localhost改为详细IP地址并设置权重即可。这里实用的是ip_hash方案,即对付集议论况下,根据ip地址来确定内容转交给哪个Tomcat处理。
upstream tomcats{
ip_hash;
server localhost:8080 weight=1;
}
#下面定义的是默认监听端口80,我们哀求所有java action(jsp)以及php都走https协议,因此80端口下放的都是静态资源(html、图片、js等),因此无须太多的配置。
server{
listen 80;
server_name xxx.com www.xxx.com;
#admin目录和phpMyAdmin目录逼迫利用https协议
location ~ /(admin|phpMyAdmin)/ {
return 301 https://$server_name$request_uri;
}
#do、jsp等交由Tomcat来处理
location ~ .\.(do|jsp|action|jspx|shtml)?$ {
proxy_pass http://tomcats;
}
}
#下面是监听https协议(默认443端口)
server {
listen 443 ssl;
server_name xxx.com www.xxx.com;
server_tokens off;
charset utf-8;
//限定并发连接数,这里的“addr”是在前面的“ limit_conn_zone”中定义的,名称要保持同等
limit_conn addr 5;
#只许可我们的域名访问
if ($host !~ ^(xxx.com|www.xxx.com|images.xxx.com)$ ) {
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/nginx/html;
#设置默认首页
index index.html index.htm index.php;
include /etc/nginx/default.d/.conf;
#配置ssl证书
ssl_certificate /etc/letsencrypt/live/xxx.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/xxx.com/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 / {
}
location ^~ /static/{
}
#admin目录转交Tomcat处理
location ~ /admin/ {
proxy_pass http://tomcats;
}
#do、jsp等资源转交Tomcat处理
location ~ .\.(do|jsp|action|jspx|shtml)?$ {
proxy_pass http://tomcats;
}
#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\公众/>
这里顺便将Host的unpackWARs以及autoDeploy设置成false,紧张是为了提高安全性。
至此,所有配置完成,访问网站的时候可以看到URL位置有“安全连接”的提示: