nginx降权
示例环境:centos7
降权运行的应用场景
首先我们来看。默认模式下nginx的运行状态:
[root@blackstone batman]# ps -elf | grep nginx | grep -v grep
可以看到有两个进程,分别以不同的权限在运行,master进程使用的是root权限,而这里的worker进程则使用的是nginx权限。在单人使用服务器时是完全ok的,但是一旦涉及到多个用户管理同一台设备的nginx就会出现权限问题,==一方面要想完全控制nginx就需要root权限,权限分配敏感,另一方面,nginx如果由于自己的安全问题被攻破,则会危及到整台服务器。==故我们有必要在某些特定的场景下让nginx降权运行。
我们需要为nginx配置一个单独的用户以及用户组,所有在组内的成员均可以运行管理nginx,并且用户权限还得足够的大,可以使得nginx降权后的服务可以运行在80端口之上。这就是我们要解决的问题。
创建管理用户
//1.创建用户
[root@blackstone ~]# useradd inca
//2.切换到用户并查看当前目录
[root@blackstone ~]# su - inca
[inca@blackstone ~]$ pwd
/home/inca
//3.创建nginx相关工作目录
[inca@blackstone ~]$ mkdir conf logs www
//4.复制进必要的组件
[inca@blackstone ~]$ cp /usr/local/nginx/conf/mime.types /home/inca/conf/
//5.写入测试网页
[inca@blackstone ~]$ echo inca > www/index.html
[inca@blackstone ~]$ ll
total 0
drwxrwxr-x. 2 inca inca 24 Oct 17 02:17 conf
drwxrwxr-x. 2 inca inca 6 Oct 17 02:17 logs
drwxrwxr-x. 2 inca inca 24 Oct 17 02:17 www
[inca@blackstone ~]$ ll conf/
total 8
-rw-r--r--. 1 inca inca 5170 Oct 17 02:17 mime.types
//6.导入配置文件
[inca@blackstone ~]$ cp /usr/local/nginx/conf/nginx.conf /home/inca/conf/nginx.conf
到此我们还需要对配置文件进行定制化,此处修改到http模块结束即可
user inca inca;
worker_processes 1;
error_log /home/inca/logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
pid /home/inca/logs/nginx.pid;
events {
use epoll;
worker_connections 1024;
}
http {
include /home/inca/conf/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 logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
#gzip on;
server {
listen 8080;
server_name localhost;
root /home/inca/www;
#charset koi8-r;
access_log /home/inca/logs/access.log main;
location / {
index index.html index.htm;
}
} //下面不变
注意:此处所有参数的值,带路径的都要改成/home/inca特权用户root使用的是80端口,改为普通用户使用的端口,在1024以上,改为8080
//7.测试效果---这里一定要全路径启动nginx,可能会有多余的信息出来
[inca@blackstone ~]$ /usr/local/nginx/sbin/nginx -c /home/inca/conf/nginx.conf
//查看进程
[inca@blackstone ~]$ ps -ef | grep nginx
可以看到此处属于inca用户的nginx进程已经运行,再次使用curl测试网页解析情况
[inca@blackstone ~]$ curl -I 192.168.2.160:8080
到此,降权配置成功。
当然打开浏览器进行测试也是可以的。
端口调整
虽然在前面的例子中我们实现了降权运行nginx,但是却人为的指定了8080端口,无法通过默认的443或者80端口访问这个网站,这对用户来说是不方便的,那么如果一定要将端口绑定到8080上,我们有没有办法呢?答案肯定是有的。
我们先尝试强行绑定到80端口:
启动nginx试试:权限不足,启动失败
这里我们需要修改nginx程序的capabilities属性
#这里需要转移到nginx执行目录下进行操作,也可以使用绝对路径直接对nginx的执行文件进行cap修改
[root@blackstone ~]# cd /usr/local/nginx/sbin/
[root@blackstone sbin]# setcap cap_net_bind_service=eip nginx
[root@blackstone sbin]# getcap nginx
nginx = cap_net_bind_service+eip
再次尝试:
[inca@blackstone ~]$ /usr/local/nginx/sbin/nginx -c conf/nginx.conf
[inca@blackstone ~]$ netstat -antup | grep 80
[inca@blackstone ~]$ curl -I 192.168.2.160:80
可以看到此时的80端口已经被我们通过inca用户启用了。通过浏览器查看:
注:上文中提到的capabilities属性是linux提出用于细粒度管理进程或程序的属性,关于它的详细信息可以参考:Linux Capabilities 简介
PHP环境部署
1.下载安装php
#1.yum安装php
yum install php
#2.安装相关模块
yum install php-mysql php-fpm php-cli php-dba php-embedded php-gd php-common php-bcmatch php-enchant php-devel
#3.查看php版本
php -v
#4.启用fpm服务
#注:php-fpm是php的一个php的fast-cgi服务管理器,专门用于控制php-cgi的fastcgi进程。
systemctl start php-fpm
systemctl enable php-fpm
#查看服务状态
systemctl status php-fpm
2.配置nginx将php解析代理出去
配置文件:这里的配置文件必须为启动时载入的配置文件,可以使用nginx -t选项来查看启用nginx时使用的配置文件在哪里
vim /etc/nginx/nginx.conf
在配置文件里面找到http { },在里面输入:
# fastcgi conf
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
# php配置
server {
listen 80; # 监听端口
server_name www.example.org; # 访问域名
access_log /var/www/eg/access.log; # 成功日志
error_log /var/www/eg/access.log; # 错误日志
root /var/www/eg; # 根目录
index index.html index.htm index.php; # 首页文件格式
# php解析配置
location ~ .*\.(php|php5)?$ {
root /var/www/html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/eg$fastcgi_script_name;
include fastcgi_params;
}
# 静态文件图片规则
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
expires 30d;
}
# 静态文件js、css规则
location ~ .*\.(js|css)?$ {
expires 1h;
}
}
重启服务
[root@blackstone ~]# nginx -s reload
3.测试解析效果
#创建测试目录
mkdir /var/www/eg
#编辑页面
vi /var/www/eg/index.php
#输入内容
<?php
echo "hello,world";
phpinfo();
?>
浏览器访问: