一、nginx安装

1
2
3
4
5
6
7
8
#安装依赖
sudo apt-get install openssl zlib1g-dev libssl-dev gcc libpcre3 libpcre3-dev
#配置
./configure --prefix=/srv/nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gzip_static_module --with-mail --with-mail_ssl_module
#安装
make && make install
#设置nginx环境变量(软链接)
sudo ln -s /srv/nginx/sbin/nginx /usr/local/sbin/nginx

二、nginx模块管理

查看已安装的模块

1
nginx -V

添加编译模块

  1. 查看已安装的模块

    1
    2
    3
    nginx -V
    # 复制configure arguments后的模块
    configure arguments: --prefix=/srv/nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gzip_static_module --with-mail --with-mail_ssl_module
  2. 重新配置编译选项并追加新增的某块

    1
    ./configure --prefix=/srv/nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gzip_static_module --with-mail --with-mail_ssl_module 
  3. make

    切勿执行make install,否则将覆盖已安装的nginx

  4. 备份已安装的nginx二进制文件

    1
    cp /usr/local/sbin/nginx /usr/local/sbin/nginx.bak
  5. 替换重新编译的er禁止文件

    1
    2
    # 源码目录中
    cp ./objs/nginx /usr/local/sbin/nginx
  6. 测试无误后删除备份

    1
    rm /usr/local/nginx/sbin/nginx.bak

三、nginx基本配置

代理转发

http代理转发

1
2
3
4
5
6
7
8
# 将域名为x.domain.com的请求代理至localhost的8080端口
server{
listen 80;
server_name x.domain.com;
location / {
proxy_pass http://localhost:8080/;
}
}

https代理转发

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 默认https使用443端口
# 将从443端口进入且域名为x.domain.com的请求代理至localhost的8080端口
server {
listen 443 ssl;
server_name x.domain.com;

ssl on;
ssl_certificate ${cert_path}/x.pem;
ssl_certificate_key ${cert_path}/x.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;

location / {
proxy_pass http://localhost:8080/;
}
}

http强转https

1
2
3
4
5
6
7
8
9
# 将域名为x.domain.com的请求301重定向为https协议请求
server{
listen 80;
server_name x.domain.com;

location / {
return 301 https://$host$request_uri;
}
}

禁止ip直接访问

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#禁止ip直接访问80端口
server {
listen 80 default_server;
server_name _;
return 444;
}
#禁止ip直接访问443端口
server {
listen 443 ssl default_server;
server_name _;

ssl on;
ssl_certificate ${pem_file};
ssl_certificate_key ${key_file};
ssl_session_timeout 5m;
ssl_ciphers ${ssl_ciphers_string};
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
return 444;
}

四、nginx开源模块

上游节点健康检测

健康检测选用淘宝团队开发的nginx_upstream_check_module模块

  1. 安装nginx_upstream_check_module
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 进入nginx源码目录
cd /srv/nginx-1.12.1

# 下载check模块
wget -O nginx_upstream_check_module.zip 'https://codeload.github.com/yaoweibin/nginx_upstream_check_module/zip/master'

# 解压
unzip nginx_upstream_check_module.zip

# 打补丁
patch -p1 < ./nginx_upstream_check_module-master/check_1.12.1+.patch

# 添加check模块(参考上面添加编译模块的方法)
./configure ${origin_params} --add-module=./nginx_upstream_check_module-master/
make (注意:此处只make,编译参数需要和之前的一样)
mv /usr/local/sbin/nginx /usr/local/sbin/nginx-1.21.1.bak
cp ./objs/nginx /usr/local/sbin/nginx

# 检测是否成功
/usr/local/sbin/nginx -t
  1. 配置健康检测
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 配置上游服务器健康检测
upstream tomcat-cluster-2 {
server 127.0.0.1:8082; #上游服务器地址及端口
check interval=1800000 rise=2 fall=5 timeout=1000 type=http; #检测规则
check_http_send "GET /health HTTP/1.0\r\n\r\n"; #健康检测接口,将按检测规则进行轮询
check_http_expect_alive http_2xx http_3xx; #规定健康检测接口的成功返回状态码
}
# 配置服务器
server{
listen 80;
server_name x.domain.cn;

location / {
proxy_pass http://tomcat-cluster-2/;
}
# 开启健康状态页面路由
location /status {
check_status html; #健康状态页面,默认以html格式展现,可选html、json、csv
access_log off; #不记录access_log
#allow all;
#deny all;
}
}
  1. 查看健康状态

按照如上配置,访问x.domain.cn/status可以看到健康状态

其中number代表上游服务器节点个数,generation为健康检测本身load的次数(nginx重启或者reload都会导致generation增加)

更多健康检测模块配置参考配置文档

sticky

官方收费版,参考nginx stciky模块

开源版,参考https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng

五、更多配置

413 Request Entity Too Large Error

1
2
# http, server 或 location节点中添加
client_max_body_size 10M;

用户(组)管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 新增用户
useradd -s /bin/zsh -d /home/$user -m $user
# 修改用户密码
passwd $user
# 用户添加到新组
usermod -a -G $newGroup $user
# 查看用户信息信息
id $user
uid=1001($user) gid=1001($user) groups=1001($user),33(www-data)
# 给用户分配组
gpasswd -a $user $group
# 查看用户所属组情况
groups $userName
# 把用户从组删除
gpasswd -d $user $group
# 删除用户
userdel -r $user

用户(组)权限管理

1
2
3
4
5
# 给目录指定所属用户及所属用户组
chown -R $user:$group $directory
# 给目录指定同组用户的权限
chmod -R g+wrx $directory
chmod -R g-wrx $directory

管理虚拟内存

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 先看一下当前内分分布
free -m

# 开始分配虚拟内存
mkdir /usr/img/
rm -rf /usr/img/swap
dd if=/dev/zero of=/usr/img/swap bs=1024 count=2048000
mkswap /usr/img/swap
swapon /usr/img/swap

# 查看分配虚拟内存后的内存分布
free -m

# 使用完干掉虚拟内存
swapoff /usr/img/swap
rm -f /usr/img/swap

本文将介绍如何使用Java原生命令打包构建一个java web项目。

虽说现在有ant、maven、gradle等打包构建工具,可以很方便的完成打包构建目标,但是不妨看看他们是如何封装jdk命令完成打包构建的。

另一方面,古老的项目,没有使用高级的打包构建工具也没有IDE的情况下,也只能自己通过脚本来完成原生的打包任务了。

再者,java9来了,jdk更新了许多新的命令,重新回忆下传统命令也是好的。

一、项目结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
project
├── README.md
├── lib #jar包目录
│   ├── a.jar
│   └── *.jar
├── src #源码目录
│   ├── package1
│   └── package*
└── web #web资源目录
├── WEB-INF
│   └── web.xml
├── js
├── css
└── index.html

二、编译源文件

1
2
3
4
5
6
cd project
# 创建out目录,out目录下创建classes目录
# out存放所有需要被打进war包的文件;out/classes存放所有编译好的字节码文件
mkdir -p out/classes
# 开始编译源文件
javac -g -cp "./lib/*" -d ./out/classes -encoding UTF8 $(find ./src -name "*.java")

javac为源文件的编译命令,其使用格式为:javac <options> <source files>

-g 默认情况下 javac 只生成行号和源文件信息,添加g参数将生成所有的debug信息,其中包括本地变量(spring参数注解等)。

-cp 全拼是-classpath,可以指定源文件依赖的jar包或字节码文件

-d 可以指定字节码文件的输出目录

$(find ./src -name "*.java") 指定的是待编译的源文件,这里使用了系统的find命令来进行通配src目录下的所有java文件

更多javac命令细节参考java8 javac docs

三、按J2EE规范组织资源

J2EE规范规定了web资源文件、jar包文件、字节码文件等的组织结构如下,这也是最终war内部的目录结构

1
2
3
4
5
6
7
8
project/out
├── WEB-INF
│   ├── classes
│   ├── lib
│   └── web.xml
├── js
├── css
└── index.html

开始按这个结构调整目录

1
2
3
4
5
6
cd project
# 复制web资源目录、jar包目录至out目录
cp -r lib web/* out/
# 将字节码文件和jar包文件复制至WEB-INF目录下
cd out
mv lib classes WEB-INF/

四、打war包

1
2
3
cd project/out
# 打war包
jar cvf ./project.war ./*

更多jar命令细节,参考java8 jar docs

五、FAQ

字节码文件目录中的文件找不到

原因

war包部署到web服务器启动时报文件(字节码文件目录中)找不到,这常常是由于源码目录中存放了非java文件,而我们上面说的步骤只是对源码目录进行了编译,没有处理这些非java文件,而这些文件确实被依赖,所以项目自然无法启动。

场景

举个实际场景如:使用mybatis时常会把ORM映射关系文件(xml)放在源码目录,如果不将映射文件移动到打包目录,打出来的war包就无法正常部署。

1
2
3
4
5
6
project/src
├── package1
│   ├── mapping1.xml
│   └── mapping*.xml
└── package*
    └── *.java

解决方案

将非java文件从源码目录移至WEB-INF/classes对应位置即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mv project/src/package1/* project/out/WEB-INF/classes/package1/
#移动后的结构
project
├── src #源码目录
│   ├── package1
│   | ├── mapping1.xml
│   | └── mapping*.xml
│   └── package*
│   └── *.java
└── out #打包目录
   ├── package1
   | ├── mapping1.xml
   | └── mapping*.xml
└── package*
└── *.class

spring注解的参数无法解析

原因

javac命令编译源文件的时候没有启了g参数,如果没有开启,spring的注解将被忽略

参考Spring annotations and Javac debug mode

解决方案

开启g参数来编译源文件

1
javac -g ...

一、安装

安装环境为:ubuntu

1
2
3
4
5
6
# 安装并配置必须的依赖
sudo apt-get install -y curl openssh-server ca-certificates
# 添加gitlab包及服务并安装gitlab包
curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash sudo apt-get install gitlab-ce
# 配置并启动gitlab
sudo gitlab-ctl reconfigure

二、配置gitlab访问域名及端口

1
2
3
4
# 打开gitlab配置文件
vim /etc/gitlab/gitlab.rb
# 修改访问入口项
external_url 'http://code.domain.com:${port}'

三、访问并设置初始密码

初始账号为root,第一次访问时会要求重置密码

四、初始化项目

Git global setup
1
2
git config --global user.name "willow"
git config --global user.email "admin@example.com"
Create a new repository
1
2
3
4
5
6
git clone git@code.willowspace.cn:root/willow.git
cd willow
touch README.md
git add README.md
git commit -m "add README"
git push -u origin master
Existing folder
1
2
3
4
5
6
cd existing_folder
git init
git remote add origin git@code.willowspace.cn:root/willow.git
git add .
git commit -m "Initial commit"
git push -u origin master
Existing Git repository
1
2
3
4
cd existing_repo
git remote add origin git@code.willowspace.cn:root/willow.git
git push -u origin --all
git push -u origin --tags

五、常规维护

启停

1
2
3
4
5
6
7
8
# 启动Gitlab所有组件
sudo gitlab-ctl start

# 停止Gitlab所有组件
sudo gitlab-ctl stop

# 重启Gitlab所有组件
sudo gitlab-ctl restart

备份配置

打包/etc/gitlab/下所有文件

备份数据

1
2
3
4
sudo gitlab-rake gitlab:backup:create
#产生的备份包名形如下
1490183942_2017_03_22_gitlab_backup.tar
#备份文件位于/var/opt/gitlab/backups路径下

恢复数据

1
2
3
4
sudo gitlab-ctl stop unicorn
sudo gitlab-ctl stop sidekiq
sudo gitlab-ctl status
sudo gitlab-rake gitlab:backup:restore BACKUP=1490183942_2017_03_22

卸载

1
2
3
4
sudo gitlab-ctl stop
sudo gitlab-ctl uninstall
# 删除所有gitlab文件,在根目录下find -name gitlab*,找到所有相关文件,然后执行删除。
find -name gitlab*

短信验证码业务介绍

短信验证码是通过将验证因子置于短信息中,通过手机传达给用户,以此验证因子作为凭证达到服务端校验客户端身份的目的。短信信道相对于网络信道较安全,因此许多需要身份验证的业务(e.g. 注册、登录、找回密码等)常使用短信验证码来作为身份校验。

短信验证码业务流程

短信平台接入

短信平台可以和第三方短信通道运营商签约自行搭建。也可以直接接入第三方短信平台。下面推荐一个短信平台。

云之讯短信平台

详细的接入流程参考云之讯官网上的文档

云之讯官方的SDK不太友好,可结合官方SDK自行开发。

0%