Nginx网站服务配置

一、NGINX概述

1.1 nginx简介

Nginx ("engine x") 是一个开源、高性能、高可靠的 HTTP 和反向代理服务器。Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。其将源代码以类 BSD 许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011 年 6 月 1 日,Nginx 1.0.4 发布。
Nginx 是一款轻量级的 Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,单台物理服务器可支持30 000~50 000个并发请求。并在一个 BSD-like 协议下发行。由俄罗斯的程序设计师 Igor Sysoev 所开发,供俄国大型的入口网站及搜索引擎 Rambler(俄文:Рамблер)使用。其特点是占有内存少,并发能力强,事实上 Nginx 的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用 Nginx 网站用户有:百度 BWS、新浪、网易、腾讯、等。

 

Tengine:

Tengine 是由淘宝网发起的 Web 服务器项目。它在 Nginx 的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine 的性能和稳定性已经在大型的网站如淘宝网、天猫商城等得到了很好的检验。(可以这样理解:淘宝网拿到了 Nginx 源代码之后,进行了功能的填充、优化等等,然后提交给
Nginx 官方,但是由于 Nginx 官方相应慢甚至不响应,加上语言沟通的不顺畅,于是淘宝公司就自己打包,在遵循 GPL 的原则上进行二次开发,于是就出了现在的 Tengine 这个版本)

1.2 Nginx和Apache的差异

Nginx Apache
nginx是一个基于事件的web服务器 apache是一个基于流程的服务器
所有请求都由一个线程处理 单个线程处理单个请求
nginx避免子进程的概念 apache是基于子进程的
nginx类似于速度 apache类似于功率
nginx在内存消耗和连接方面比较好 apache在内存消耗和连接上没有提高
nginx在负载均衡方面表现较好 当流量到达进程极限时,apache将拒绝新的连接。
nginx不支持IBMI和openvms一样的os apache支持更多的os
nginx只具有核心功能 apache提供了比nginx更多的功能
nginx的性能和可伸缩性不依赖于硬件 apache依赖于cpu和内存等硬件组件
Nginx支持热部署 Apache不支持热部署

 

 


 
 
 
 
 
 
 
 
 
 
 
 
Apache: 创建多个进程或线程,而每个进程或线程都会为其分配cpu和内存(线程要比进程小的多,所以worker支持比perfork高的并发),并发过大会榨干服务器资源。
Nginx: 采用单线程来异步非阻塞处理请求(管理员可以配置Nginx主进程的工作进程的数量),不会为每个请求分配cpu和内存资源,节省了大量资源,同时也减少了大量的CPU的上下文切换。所以才使得Nginx 支持更高的并发。

1.3 Nginx和Apache的优缺点比较

(1)nginx相对于apache的优点∶
  • 轻量级,同样起web服务,比apache占用更少的内存及资源
  • 抗并发,nginx处理请求是异步非阻塞的,而apache是阻塞型的在高并发下,nginx能保持低资源低消耗高性能
  • 高度模块化的设计,编写模块相对简
  • 支持热部署,平滑升级

(2)apache相对于nginx的优点∶

  • Rewrite比nginx的rewrite强大 (rewrite的主要功能就是实现统一资源定位符URL的跳转)
  • 模块多,基本想到的都可以找到
  • 少bug, nginx的bug相对较多
  • 超稳定
  • Nginx处理动态请求是弱项,动态请求要Apache去做。
总结:一般来说,需要性能的web服务,用Nginx. 如果不需要性能只求稳定,那就Apache。Nginx处理动态请求是弱项,一般动态请求要Apache去做,Nginx只适处理静态网页或反向代理。

1.4 nginx的进程

Apache和Nginx的默认端口都是80,如果其中一个已经启动了,那么再启动另一个会报错。如果想要同时使用,可以修改其中一个的端口号。
Nginx有两个进程:

master process:主进程(守护进程),用来管理工作进程。

worker process:工作进程,用来处理用户的请求。

二 编译安装nginx服务

2.1 关闭防火墙将nginx所需软件包到/opt目录下

  1. systemctl stop firewalld

  2. setenforce 0nginx-1.12.0.tar.gz

  3. nginx-1.22.1.tar.gz

 2.2 安装依赖包

yum -y install pcre-devel zlib-devel gcc gcc-c++ make

 

 2.3 创建运行用户和组,便于管理

(Nginx 服务程序默认以 nobody 身份运行,建议为其创建专门的用户账号,以便更准确地控制其访问权限)​Nginx服务程序默认以匿名运行

useradd -M -s /sbin/nologin nginx

 

2.4 解压软件包,编译安装nginx

cd /opt
tar zxvf nginx-1.12.2.tar.gz -C /opt/

cd nginx-1.12.0/
./configure \
--prefix=/usr/local/nginx \ #指定nginx的安装路径
--user=nginx \ #指定用户名
--group=nginx \ #指定组名
--with-http_stub_status_module #启用 http_stub_status_module 模块以支持状态统计

make -j2 && make install

ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ #让系统识别nginx的操作命令

 

 

 

 

2.5 检查、启动、重启、停止 nginx服务

nginx -t  #检查配置文件是否配置 正确
#启动
nginx
 
#停止
cat /usr/local/nginx/logs/nginx.pid                 #先查看nginx的PID号
kill -3 <PID号>                                    #直接杀死
kill -s QUIT <PID号>                               #优雅的杀死()
killall -3 nginx
killall -s QUIT nginx
#重载
kill -1 <PID号>
kill -s HUP <PID号>
killall -1 nginx
killall -s HUP nginx
 
#日志分割,重新打开日志文件
kill -USR1 <PID号>
#平滑升级
kill -USR2 <PID号>
新版本升级∶
tar -zxvf nginx-1.xx.xX. tar.gz
cd nginx-1.xx. xx
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module \
--with-http_ssl_module
 
make
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx_old
cp objs/nginx /usr/local/nginx/sbin/nginx
make upgrade
#或者先 killall nginx ,再/usr/local/nginx/sbin/nginx

2.6、添加nginx系统服务

方法一:使用脚本

vim /etc/init.d/nginx           #创建脚本文件内容如下:
 
#!/bin/bash
#chkconfig: - 99 20
#description:Nginx Server Control Script
COM="/usr/local/nginx/sbin/nginx"
PID="/usr/local/nginx/logs/nginx.pid"
case "$1" in
start)
   $COM
;;
 
stop)
   kill -s QUIT $(cat $PID)
;;
 
restart)
   $0 stop
   $0 start
;;
 
reload)
   kill -s HUP $(cat $PID)
;;
 
*)
echo "Usage:$0 {start|stop|restart|reload}"
exit 1
 
esac
exit 0
chmod +x /etc/init.d/nginx
chkconfig --add nginx
systemctl daemon-reload          #磁盘上的ngin服务更改,运行'systemctl daemon-reload'重新加载单元。
systemctl start nginx
systemctl stop nginx

方法二∶

vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecrReload=/bin/kill -s HUP SMAINPID
ExecrStop=/bin/kill-s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
chmod 754 /lib/systemd/ system/nginx.service
systemctl start nginx.service
systemctl enable nginx.service

【Unit】∶服务的说明 Description∶ 描述服务 After∶依赖, 当依赖的服务启动之后再启动自定义的服务

【Service】服务运行参数的设置
Type=forking是后台运行的形式,使用此启动类型应同时指定PIDFile=,以便systemd能够跟踪服务的主进程。
ExecStart为服务的具体运行命令 ExecReload为重启命令 ExecStop为停止命令
PrivateTmp=True表示给服务分配独立的临时空间 注意∶ 启动、重启、停止命令全部要求使用绝对路径

【Install】服务安装的相关设置,可设置为多用户

三、实例操作:编译安装nginx服务

3.1、关闭防火墙,将安装nginx所需软件包传到/opt目录下

3.2、安装依赖包


  

3.3、创建运行用户、组


 

3.4、编译安装Nginx

3.4.1 解压Nginx软件包


 

3.4.2 安装相关模块


  

3.4.3 编译安装


  

3.4.4 将Nginx链接到/user/local/sbin下


  

3.5、检查、启动、重启、停止Nginx服务

3.5.1 检查和启动


 

3.5.2 停止、重启nginx服务

3.5.2.1 停止nginx服务


 

3.5.2.2 重载服务

3.6、添加nginx 系统服务

3.6.1 vim/lib/systemd/system/nginx.service文件,并添加配置内容

3.6.2 赋予权限并开启服务

  

四、认识Nginx服务的主配置文件

vim /usr/local/nginx/conf/nginx.conf

4.1、全局配置

#user  nobody;                          #运行用户,若编译时未指定则默认为 nobody
worker_processes  1;                    #工作进程数量,可配置成服务器内核数 * 2,如果网站访问量不大,一般设为1就够用了
#error_log  logs/error.log;             #错误日志文件的位置
#pid        logs/nginx.pid;             #PID 文件的位置

4.2、I/O事件配置

events {
    use epoll;                          #使用epoll模型,2.6及以上版本的系统内核,建议使用epoll模型以提高性能
    worker_connections  4096;           #每个进程处理 4096个连接
}

如提高每个进程的连接数还需执行"ulimit -n 65535"命令临时修改本地每个进程可以同时打开的最大文件数。
在Linux平台上,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄)。
可使用ulimit -a命令查看系统允许当前用户进程打开的文件数限制。

4.3、HTTP 配置

http {
    include       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;                                                ##支持文件发送(下载)
    ##此选项允许或禁止使用socket的TCP cORK的选项(发送数据包前先缓存数据),此选项仅在使用sendfile的时候使用
    #tcp_nopush     on;
    ##连接保持超时时间,单位是秒
    #keepalive_timeout  0;
    keepalive_timeout  65;
     
    #gzip  on;                                                              ##gzip模块设置,设置是否开启gzip压缩输出
     
server {
        listen       80;                                        ##监听地址及端口
        server_name  www.clj.com;                                       ##站点域名,可以有多个,用空格隔开
 
        #charset utf-8;                                         #网页的默认字符集
 
        #access_log  logs/host.access.log  main;       
 
        location / {                                            ##根目录配置
            root   html;                                        ##网站根目录的位置/usr/local/nginx/html
            index  index.html index.htm;                                        ##默认首页文件名
        }
 
        #error_page  404              /404.html;
 
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;                              ##内部错误的反馈页面
        location = /50x.html {                                ##错误页面配置
            root   html;
        }

日志格式设定∶
$remote_addr与$http x forwarded for用以记录客户端的ip地址;
$remote user∶ 用来记录客户端用户名称;
$time local∶ 用来记录访问时间与时区;$request∶用来记录请求的url与http协议;
$status∶ 用来记录请求状态;成功是200,
$body bytes sent ∶ 记录发送给客户端文件主体内容大小;
$http referer∶ 用来记录从哪个页面链接访问过来的;
$http user agent∶记录客户浏览器的相关信息;

通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过Sremote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。

location常见配置指令, root、alias、proxy_ pass
root (根路径配置)∶ 请求ww.xkq.com/test/1.jpg,会返回文件/usr/local/nginx/html/test/1.jpg
alias (别名配置)∶请求www.xkq.com/test/1.jpg,会返回文件/usr/local/nginx/html/1.jpg

五、访问状态统计配置

5.1、访问状态统计配置的操作步骤

5.1.1.先使用命令/usr/local/nginx/sbin/nginx -V查看已安装的Nginx 是否包含HTTP_STUB_STATUS模块

5.1.2.修改 nginx.conf 配置文件,指定访问位置并添加 stub_status 配置(修改之前进行备份)

cd /usr/local/nginx/conf/
cp nginx.conf nginx.conf.bak
vim nginx.conf
 
server {
        listen       80;
        server_name  www.clj.com;
 
        charset utf-8;
 
        #access_log  logs/host.access.log  main;
 
        location / {
            root   html;
            index  index.html index.htm;
        }
        ##添加 stub_status 配置
        location /status {              ##访问位置为/status
            stub_status on;             ##打开状态统计功能
            access_log off;             ##关闭此位置的日志记录
        }

5.1.3、重启服务,访问测试

systemctl restart nginx

浏览器访问 http;//192.168.2.66/status

Active connections ∶ 表示当前的活动连接数;
server accepts handled requests∶表示已经处理的连接信息,三个数字依次表示:已处理的连接数、成功的TCP握手次数,已处理的请求数。
可curl http∶//192.168.2.66/status 结合 awk与if 语句进行性能监控

5.2、实例操作:访问状态统计配置

5.2.1 使用命令/usr/local/nginx/sbin/nginx -V查看已安装的 Nginx 是否包含HTTP_STUB STATUS模块


  

5.2.2 修改nginx.conf 配置文件,指定访问位置并添加stub_status 配置


  

5.2.3 重启服务后进行访问测试

六、基于授权的访问控制

6.1、基于授权的访问控制的操作步骤

6.1.1 生成用户密码认证文件

yum install -y httpd-tools
htpasswd -c /usr/local/nginx/passwd.db zhangsan
chown nginx /usr/local/nginx/passwd.db
chmod 400 /usr/local/nginx/passwd.db

6.1.2 修改主配置文件相对应目录,添加认证配置项

vim /usr/local/nginx/conf/nginx.conf
.....
   server {
      location / {
       .....
      ##添加认证配置##
    auth basic "secret";     #设置密码提示框文字信息
    auth_basic_user_file /usr/local/nginx/passwd.db;
    }
}

6.1.3 重启服务,访问测试

nginx -t
systemctl restart nginx.service

浏览器访问 http∶//192.168.2.66

6.2、实例操作:基于授权的访问控制

6.2.1 生成用户密码认证文件

6.2.2 修改主配置文件相对应目录,添加认证配置项

6.2.3 重启服务,访问测试


  

  

6.3、基于客户端访问控制

6.3.1 基于客户端访问控制的操作步骤

访问控制规则如下:

• deny IP/IP段: 拒绝某个IP或IP段的客户端访问

• allow IP/IP 段: 允许某个IP或IP段的客户端访问

• 规则从上往下执行,如匹配则停止,不再往下匹配

vim /usr/local/nginx/conf/nginx.conf
 
 location / {
            root   html;
            index  index.html index.htm;
            auth_basic "secret";
            auth_basic_user_file /usr/local/nginx/passwd.db;
             
            # 添加控制规则
            deny 192.168.2.66;                 #拒绝访问的客户端IP
            allow all;                          #允许其他所有客户端访问
        }
 
systemctl restart nginx

6.3.2 实例操作:基于客户端访问控制

6.3.2.1 在主配置文件中添加控制规则


  

6.3.2.2 重启服务并访问测试

使用被拒绝的客户端进行访问测试


 

使用其他客户端进行访问测试



 

 

posted @ 2022-11-17 16:25  原味苦茶  阅读(89)  评论(0编辑  收藏  举报