前言
最近用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 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;
}
}
}
#=============================================
- 啓動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沒有轉發到應用等等。所以再簡單事也要自己動手試試,否則就只會眼高手低。