前言
最近用springboot做微信小程序后端。微信小程序后端服务只能使用443端口,导致应用只能使用root权限启动。做为长期linux工作者的我真忌讳使用root启动应用。所以花了点实现学习下应用生产部署。
起初想简单点直接使用iptables的NAT转发,折腾了半天没搞定。后面使用nginx反向代理。 最后的部署图:
实施详情
iptables安装配置
- 禁用centos自带的firewall
systemctl stop firewalld.service
systemctl disable firewalld.service
- 安装iptables
yum install iptables-services -y
systemctl enable iptables
systemctl start iptables
- 配置防火墙
# 后悔药
cp /etc/sysconfig/iptables /etc/sysconfig/iptables.`date +%Y%m%d`
编辑防火墙配置文件,添加放开80、443、3306 和ssh远程登录等端口
vim /etc/sysconfig/iptables
##==========================================================
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
##ssh服务端口,这不放开ssh就会登不上
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
##自定义
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
##一定要放在这两行前面
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
##=================================================================
- 生效配置
systemctl restart iptables.service #最后重启防火墙使配置生效
systemctl enable iptables.service #设置防火墙开机启动
nginx安装配置
- 添加nginx源 默认情况Centos7中无Nginx的源。
sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
- 安装Nginx 通过yum search nginx看看是否已经添加源成功。如果成功则执行下列命令安装Nginx。
sudo yum install -y nginx
- 配置nginx
##万能后悔药
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.`date +%Y%m%d`
vi /etc/nginx/nginx.conf
##=============================================
user xiaoming; #工作用户
worker_processes 1;
error_log /home/xiaoming/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/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 /home/xiaoming/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
server {#80端口请求,直接跳转至443
listen 80;
server_name www.xiaoming.com;
rewrite ^(.*)$ https://${server_name}$1 permanent;
}
server {#证书配置
listen 443;
ssl on;
ssl_certificate /home/xiaoming/nginx.crt;
ssl_certificate_key /home/xiaoming/nginx.key;
access_log /home/xiaoming/log/nginx/service.log main;
charset utf-8;
location / {#所有443请求转发到127.0.0.1:8080
proxy_pass http://127.0.0.1:8080;
}
}
}
##=============================================
- 启动Nginx并设置开机自动运行
sudo systemctl start nginx.service
sudo systemctl enable nginx.service
说到这里分享个nginx部署权限
进程维度:
nginx
- root (master)
- www-data (worker)
uwsgi
- root (emperor)
- www-data (worker)
目录/文件维度:
www/
config/
log/
application/
socket/
uwsgi_sock
nginx 和 uwsgi 都要以 root 权限启动,在配置文件中设置 worker 进程的用户
sock 文件
要 nginx_worker 可读 r
要 uwsgi_worker 可读可写 rx
sock 文件所在目录
要 nginx_worker 可读 r
要 uwsgi_worker 可新建文件(可读可写) rx
application 目录的所有者最好是 worker 进程的用户
静态目录/文件 要 nginx_worker 可读 r
所有目录/文件 要 uwsgi_worker 可读可写 rw
log 目录/文件
nginx 和 uwsgi 都是以 root 身份写日志,日志文件的所有者是 root
应用的部署
上面nginx已经转发到127.0.0.1:8080端口,所以应用只需要监听8080端口。
java -jar helloworld.jar >/dev/null &
一点点体会
起初觉得很简单,但真的动手还是遇到很多问题。比如iptables配置后无法访问,nginx没有转发到应用等等。所以再简单事也要自己动手试试,否则就只会眼高手低。