阿里云多应用部署记录

来源:互联网 发布:南传上座部 知乎 编辑:程序博客网 时间:2024/06/05 08:32

将应用部署到服务器上是发布中的最后一环。理论上应该有专业团队和部署平台来处理。但对于个人开发者,起初只能寒酸一点了。最近需要将多个java应用部署到一台服务器上,将自己的思路和操作记录下来。
安装系统环境请参考上一篇文章:阿里云服务器部署环境搭建

系统环境:OS:         centos 6.8/2.6.32-696.3.2.el6.x86_64jdk:        1.8.0_144mysql:      5.1.7tomcat:     8.0.36maven:      3.5.0git:        1.7.1nginx:      1.12.1

tomcat

每个应用单独通过一个tomcat运行,所以需要将tomcat复制一遍,并为每个应用提供单独配置,默认情况下,只需要修改tomcat目录下的conf/server.xml,主要是两个端口:

<!--8080改成了8081,URIEncoding="UTF-8"加上可以避免中文乱码-->  <Connector port="8081" protocol="HTTP/1.1"               connectionTimeout="20000"               redirectPort="8443" URIEncoding="UTF-8"/>
<!--8009改成了8010-->    <Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />

因为是多应用,将每个应用的端口记录下来是一个比较好的实践。

代码

代码管理使用阿里云提供的代码仓库:https://code.aliyun.com/
在阿里云代码仓库中建立代码库,并将代码提交到该代码库
在home目录下建立code目录,在该目录下为每个应用建立一个文件夹,比如我的:

/home/lucas/code├── buquan└── ssm

进入项目目录后,将代码git clone 下来,在项目根目录下执行‘mvn clean package’,打包过后的文件在 target目录下
然后将该包拷贝到相应的tomcat的webapps目录下,前提是tomcat是关着的。

cp ./target/receptionaccount.war {tomcat-dir}/webapps/

进入tomcat目录,启动tomcat并查看启动日志

 ./bin/catalina.sh start & tailf logs/catalina.out

数据库

为每个项目建立单独的数据库,并创建表。
遇到一个问题就是,MySQL的编码问题。我先建表,启动应用,结果运行时报错:

SQL state [HY000]; error code [1366]ERROR: Incorrect string value: '\xE5\x95\x8A\xE5\xAE\x9E...' for column 'problem' at row 1

显然是字符编码集的问题。
处理方式:

  1. 查看JDBC连接字符串,配置有useUnicode=true&amp;characterEncoding=utf-8,没问题

  2. tomcat的配置<Connector>加上URIEncoding="UTF-8",没效果

  3. 查看数据库字符编码集,果然有问题:

mysql>show variables like 'character_set_%';+--------------------------+----------------------------+| Variable_name            | Value                      |+--------------------------+----------------------------+| character_set_client     | latin1                     || character_set_connection | latin1                     || character_set_database   | utf8                       || character_set_filesystem | binary                     || character_set_results    | latin1                     || character_set_server     | latin1                     || character_set_system     | utf8                       || character_sets_dir       | /usr/share/mysql/charsets/ |+--------------------------+----------------------------+8 rows in set (0.00 sec)mysql>show variables like 'collation_%';+----------------------+-------------------+| Variable_name        | Value             |+----------------------+-------------------+| collation_connection | latin1_swedish_ci || collation_database   | utf8_general_ci   || collation_server     | latin1_swedish_ci |+----------------------+-------------------+3 rows in set (0.00 sec)mysql> STATUS--------------mysql  Ver 14.14 Distrib 5.1.73, for redhat-linux-gnu (x86_64) using readline 5.1Connection id:      99Current database:   accountingCurrent user:       root@localhostSSL:            Not in useCurrent pager:      stdoutUsing outfile:      ''Using delimiter:    ;Server version:     5.1.73 Source distributionProtocol version:   10Connection:     Localhost via UNIX socketServer characterset:    latin1Db     characterset:    utf8Client characterset:    latin1Conn.  characterset:    latin1UNIX socket:        /var/lib/mysql/mysql.sockUptime:         13 days 23 hours 26 min 16 secThreads: 2  Questions: 163  Slow queries: 0  Opens: 30  Flush tables: 1  Open tables: 15  Queries per second avg: 0.0--------------

然后修改数据库的字符编码集

alter database accounting character set 'UTF8';

仍然报错
4. 于是修改MySQL的配置文件,sudo vim /etc/my.cnf
在[mysqld]下加入default-character-set=utf8
我的没有[client]的配置,手动加入[client] default-character-set=utf8,最终配置为

[client]default-character-set=utf8[mysqld]datadir=/var/lib/mysqlsocket=/var/lib/mysql/mysql.sockuser=mysql# Disabling symbolic-links is recommended to prevent assorted security riskssymbolic-links=0default-character-set=utf8[mysqld_safe]log-error=/var/log/mysqld.logpid-file=/var/run/mysqld/mysqld.pid

重启MySQL

sudo /etc/init.d/mysqld stopsudo /etc/init.d/mysqld start

果然就生效了:

mysql> show variables like 'collation_%';+----------------------+-----------------+| Variable_name        | Value           |+----------------------+-----------------+| collation_connection | utf8_general_ci || collation_database   | utf8_general_ci || collation_server     | utf8_general_ci |+----------------------+-----------------+3 rows in set (0.00 sec)mysql> show variables like 'character_set_%';+--------------------------+----------------------------+| Variable_name            | Value                      |+--------------------------+----------------------------+| character_set_client     | utf8                       || character_set_connection | utf8                       || character_set_database   | utf8                       || character_set_filesystem | binary                     || character_set_results    | utf8                       || character_set_server     | utf8                       || character_set_system     | utf8                       || character_sets_dir       | /usr/share/mysql/charsets/ |+--------------------------+----------------------------+8 rows in set (0.00 sec)

但是仍然报错…
5. 再看数据表的配置:

mysql> SHOW FULL COLUMNS FROM user;   

Collation全是latin1_swedish_ci
于是修改表字段的数据类型

ALTER TABLE user CONVERT TO CHARACTER SET utf8

再试,成功。
几乎把涉及到编码集的所有地方都修改了。

Nginx配置

这里配置的是将一个域名来的请求转发到8081端口上。上文tomcat配置部分已经将应用端口配置为8081,所以实际上就是把某个域名的请求转发到相应的应用上。

购买和解析域名

首先是去万网购买域名,在阿里云控制台将dns解析到云服务器的A记录公网IP,也就是80端口上,ng监听80端口就能接收到请求了。dns解析会有缓存,时间较慢。

接下来配置ng 的反向代理

我的ng配置路径是/etc/nginx/nginx.conf ,sudo vim打开之。
在http 下配置upstream,即本地的一个应用服务器,再配置server节点,根据来源域名,代理转发到upstream上去。完整配置如下:

        upstream hy_front {            server localhost:8081;        }        server {                listen       80;                #这里配置域名                server_name  xxxxxx.top;                location / {                    # 代理转发                    proxy_pass   http://hy_front;                   #设置头信息,将头信息转发到被代理的服务器                      #转发请求的host信息                    proxy_set_header Host $host;                    # 转发最后一跳的真实ip                      proxy_set_header X-Real-IP $remote_addr;                      #转发IP                      proxy_set_header REMOTE-HOST $remote_addr;                      #转发跳转IP                      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;                    index  index.html index.htm;        }

然后重新加载ng,没有报错就是配置生效了,可以看到效果

 sudo /usr/sbin/nginx -S reload

一个坑

这里遇到个坑,就是代理过后,一些css、js等静态文件无法加载,看html是因为head里设置了一个base,这个路径变成了

<base href="http://hy_front:80/receptionaccount/">

跟ng里配的upstream的名字相同,立即想到是因为ng的配置。再看了下jsp中的代码,这base标签的生成代码是:

<%    String path = request.getContextPath();    String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()            + path + "/";%><!DOCTYPE html><html lang="zh-cn"><head>    <base href="<%=basePath%>">

问题出在request.getServerName()。搜索下,竟然有人遇到同样的问题,按照其思路,加上果然生效。参考文章

proxy_set_header Host $host;        proxy_set_header X-Real-IP $remote_addr;        proxy_set_header REMOTE-HOST $remote_addr;        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
阅读全文
0 0
原创粉丝点击