nginx降权

示例环境:centos7

降权运行的应用场景

首先我们来看。默认模式下nginx的运行状态:

[root@blackstone batman]# ps -elf | grep nginx | grep -v grep

nginx降权运行和php环境部署-小白菜博客
可以看到有两个进程,分别以不同的权限在运行,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

nginx降权运行和php环境部署-小白菜博客
可以看到此处属于inca用户的nginx进程已经运行,再次使用curl测试网页解析情况

[inca@blackstone ~]$ curl -I 192.168.2.160:8080

nginx降权运行和php环境部署-小白菜博客
到此,降权配置成功。
当然打开浏览器进行测试也是可以的。
在这里插入图片描述

端口调整

虽然在前面的例子中我们实现了降权运行nginx,但是却人为的指定了8080端口,无法通过默认的443或者80端口访问这个网站,这对用户来说是不方便的,那么如果一定要将端口绑定到8080上,我们有没有办法呢?答案肯定是有的。
我们先尝试强行绑定到80端口:
nginx降权运行和php环境部署-小白菜博客
启动nginx试试:权限不足,启动失败
nginx降权运行和php环境部署-小白菜博客
这里我们需要修改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

nginx降权运行和php环境部署-小白菜博客
可以看到此时的80端口已经被我们通过inca用户启用了。通过浏览器查看:
nginx降权运行和php环境部署-小白菜博客
注:上文中提到的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();
?>

浏览器访问:
在这里插入图片描述