一次完整的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  zfj;          #工作用戶
worker_processes  1;

error_log  /home/zfj/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/zfj/log/nginx/access.log  main;
        sendfile         on;
        #tcp_nopush      on;
        keepalive_timeout  65;
        #gzip  on;
        server {#80端口請求,直接跳轉至443
                listen 80;
                server_name www.zfj1441.com;
                rewrite ^(.*)$ https://${server_name}$1 permanent;
        }
        server {#證書配置
                listen     443;
                ssl        on;
                ssl_certificate        /home/zfj/etc/nginx.crt;
                ssl_certificate_key    /home/zfj/etc/nginx.key;
                access_log             /home/zfj/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沒有轉發到應用等等。所以再簡單事也要自己動手試試,否則就只會眼高手低。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章