Featured image of post 一次完整的iptables+nginx+springboot部署

一次完整的iptables+nginx+springboot部署

前言

最近用springboot做微信小程序后端。微信小程序后端服务只能使用443端口,导致应用只能使用root权限启动。做为长期linux工作者的我真忌讳使用root启动应用。所以花了点实现学习下应用生产部署。

起初想简单点直接使用iptables的NAT转发,折腾了半天没搞定。后面使用nginx反向代理。 最后的部署图: 在这里插入图片描述

实施详情

iptables安装配置

  1. 禁用centos自带的firewall
systemctl stop firewalld.service
systemctl disable firewalld.service 
  1. 安装iptables
yum install iptables-services -y
systemctl enable iptables
systemctl start iptables
  1. 配置防火墙
 # 后悔药
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
##================================================================= 
  1. 生效配置
systemctl restart iptables.service #最后重启防火墙使配置生效
systemctl enable iptables.service #设置防火墙开机启动

nginx安装配置

  1. 添加nginx源 默认情况Centos7中无Nginx的源。
sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
  1. 安装Nginx 通过yum search nginx看看是否已经添加源成功。如果成功则执行下列命令安装Nginx。
sudo yum install -y nginx
  1. 配置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;
                }
        }
}
##=============================================
  1. 启动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没有转发到应用等等。所以再简单事也要自己动手试试,否则就只会眼高手低。