且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

菜鸟学Linux 第096篇笔记 nginx

更新时间:2022-10-04 17:50:43

菜鸟学Linux 第096篇笔记 nginx




内容总览

ngix

进程模型

I/O models

nginx配置含义

安装配置nginx

配置nginx基于ssl通信

作业 (未做)





ngix

web服务器

反向代理:reverse proxy

http, mail

支持AIO, mmap, event-driven

模块化

热部署



进程模型

单进程:请求变多时会排队响应用户请求

多进程:每个进程响应一个请求,当请求变多时,进程量也会相应增加,进程切换次数太多

每个进程的地址空间是独立的,很多空间是重复的数据,所以内存使用效率较低

线程:thread

light weight process, LWP

linux支持多少种类型的线程库?如何切换线程库?


每个线程响应一个请求:

线程依然需要切换,相比进程线程切换属于轻量组

同一个进程的线程可以共享进程的诸多资源,比如打开的文件等;

对内存的需求较之进程略有下降

快速线程切换时会带来线程抖动

多进程多线程:相对上述响应请求相对较多,每个进程里的每个线程响应一个请求


多线程:N个请求 一个线程响应多个请求




IO复用,多路IO

I/O models

blocking I/O

nonblocking I/O

I/O multiplexing  I/O复用

signal driven I/O 信号驱动I/O

asynchronous I/O 异步I/O




httpd

MPM

prefork: 一个进程响应一个请求 1024

worker: 一个线程响应一个请求,多进程,

    一个进程生成多个线程(没有提升单线程并发连接数)

event: 基于事件驱动比前两者性能好

nginx的功能单一,许多httpd所支持的特性,nginx不支持,但并发连接数httpd无法相比




智能DNS

缓冲服务器(地域划分)


只有管理员才有权限启动小于1024的端口



nginx配置含义

server{} 虚拟主机

location{} 

location URI {} 对当前路径及子路径下的所有对象都生效;

location = URI {} 精确匹配指定的路径,不包括子路径,因此,只对当前资源生效

location ~ URI {}

location ~* URI {} 此两项表示模式匹配,可使用正则表达式,一个区分大小写另一不区分

location ^~ URI {} 不使用正则表达式

index 默认打开页面文件

root 访问目录

allow 允许哪些客户端访问

deny 拒绝哪些客户端访问

auth_basic "User Area"

auth_basic_user_file /etc/nginx/.users 此两项定义此location需要使用用户登录访问

此文件的生成是使用htpasswd 命令生成(如提示没有此命令需要安装httpd程序)


查看nginx状态的location,访问时只需要在域名后加/status即可,我这里设置了认证

location /status {

    stub_status on;

    auth_basic "User Area";

    auth_basic_user_file /etc/nginx/.users;

}


查看nginx状态显示含义

Active connections 当前处于活动连接的个数

server accepts handled requests 已经处理过了的请求个数

 已经接受的连接个数 正在处理的连接的个数 已经处理的请求个数

Reading: 正在读首部的请求个数

Writing: 读请求的主体,处理请求或者正在响应给客户端的请求

Waiting: 是上两个之和(保持的长连接)




安装配置nginx

1. 创建用户nginx


2. 官方网站下载nginx


3. 编译安装nginx

# tar -xf nginx-1.4.7.tar.gz

# cd nginx-1.4.7

#./configure \

  --prefix=/usr \

  --sbin-path=/usr/sbin/nginx \

  --conf-path=/etc/nginx/nginx.conf \

  --error-log-path=/var/log/nginx/error.log \

  --http-log-path=/var/log/nginx/access.log \

  --pid-path=/var/run/nginx/nginx.pid  \

  --lock-path=/var/lock/nginx.lock \

  --user=nginx \

  --group=nginx \

  --with-http_ssl_module \

  --with-http_flv_module \

  --with-http_stub_status_module \

  --with-http_gzip_static_module \

  --http-client-body-temp-path=/var/tmp/nginx/client/ \

  --http-proxy-temp-path=/var/tmp/nginx/proxy/ \

  --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \

  --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \

  --http-scgi-temp-path=/var/tmp/nginx/scgi \

  --with-pcre \

  --with-file-aio 


4. 为nginx添加服务脚本(非本人所写,现在只会看呵呵)

#!/bin/sh

#

# nginx - this script starts and stops the nginx daemon

#

# chkconfig:   - 85 15 

# description:  Nginx is an HTTP(S) server, HTTP(S) reverse \

#               proxy and IMAP/POP3 proxy server

# processname: nginx

# config:      /etc/nginx/nginx.conf

# config:      /etc/sysconfig/nginx

# pidfile:     /var/run/nginx.pid

 

# Source function library.

. /etc/rc.d/init.d/functions

 

# Source networking configuration.

. /etc/sysconfig/network

 

# Check that networking is up.

[ "$NETWORKING" = "no" ] && exit 0

 

nginx="/usr/sbin/nginx"

prog=$(basename $nginx)

 

NGINX_CONF_FILE="/etc/nginx/nginx.conf"

 

[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx

 

lockfile=/var/lock/subsys/nginx

 

make_dirs() {

   # make required directories

   user=`nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`

   options=`$nginx -V 2>&1 | grep 'configure arguments:'`

   for opt in $options; do

       if [ `echo $opt | grep '.*-temp-path'` ]; then

           value=`echo $opt | cut -d "=" -f 2`

           if [ ! -d "$value" ]; then

               # echo "creating" $value

               mkdir -p $value && chown -R $user $value

           fi

       fi

   done

}

 

start() {

    [ -x $nginx ] || exit 5

    [ -f $NGINX_CONF_FILE ] || exit 6

    make_dirs

    echo -n $"Starting $prog: "

    daemon $nginx -c $NGINX_CONF_FILE

    retval=$?

    echo

    [ $retval -eq 0 ] && touch $lockfile

    return $retval

}

 

stop() {

    echo -n $"Stopping $prog: "

    killproc $prog -QUIT

    retval=$?

    echo

    [ $retval -eq 0 ] && rm -f $lockfile

    return $retval

}

 

restart() {

    configtest || return $?

    stop

    sleep 1

    start

}

 

reload() {

    configtest || return $?

    echo -n $"Reloading $prog: "

    killproc $nginx -HUP

    RETVAL=$?

    echo

}

 

force_reload() {

    restart

}

 

configtest() {

  $nginx -t -c $NGINX_CONF_FILE

}

 

rh_status() {

    status $prog

}

 

rh_status_q() {

    rh_status >/dev/null 2>&1

}

 

case "$1" in

    start)

        rh_status_q && exit 0

        $1

        ;;

    stop)

        rh_status_q || exit 0

        $1

        ;;

    restart|configtest)

        $1

        ;;

    reload)

        rh_status_q || exit 7

        $1

        ;;

    force-reload)

        force_reload

        ;;

    status)

        rh_status

        ;;

    condrestart|try-restart)

        rh_status_q || exit 0

            ;;

    *)

        echo $"Usage: $0 {start|stop|status|restart|condrestart|


try-restart|reload|force-reload|configtest}"

        exit 2

esac


# chmod +x /etc/rc.d/init.d/nginx

# chkconfig --add nginx

# chkconfig --list nginx



配置nginx基于ssl通信


1. 创建CA,并为自己签名

# cd /etc/pki/CA

# (umask 077; openssl genrsa 2048 > private/cakey.pem)   创建CA私钥

# openssl req -new -x509 -key private/cakey.pem -out cacert.pem 为CA证书签名

CN HB ZJK mysky Tech ca.mysky.com caadmin@mysky.com

# touch serial

# echo 01 > serial

# touch index.txt


2. 为程序做私钥 和请求

# mkdir /etc/nginx/ssl

# cd /etc/nginx/ssl

# (umask 077;openssl genrsa 1027 > nginx.key)   为程序生成私钥

# openssl req -new -key nginx.key -out nginx.csr 生成证书请求

CN HB ZJK mysky Tech www.mysky.com

# openssl ca -in nginx.csr -out nginx.crt -days 365  使用CA为此证书请求签名


3. 配置nginx使其使用ssl通信

# vim /etc/nginx/nginx.conf

    server {

        listen       443;    

        server_name  localhost;

        

        ssl                  on;

        ssl_certificate      /etc/nginx/ssl/nginx.crt;

        ssl_certificate_key  /etc/nginx/ssl/nginx.key;

        

        ssl_session_timeout  5m;

        

        ssl_protocols  SSLv2 SSLv3 TLSv1;

        ssl_ciphers  HIGH:!aNULL:!MD5;

        ssl_prefer_server_ciphers   on;


        location / {

            root   /web/html;

            index  index.html index.htm;

        }

    }


4. 此时便可进行加密通信

https://192.168.11.141   (这个看每个人的建立的IP了,具体输入的IP要按实际的为准)

或在服务器查看是否启用443端口

# netstat -tnlp






作业


实现nginx + php + mysql + xcache 使其可运行动态网站


实现keepalived + nginx  和 corosync + nginx

本文转自Winthcloud博客51CTO博客,原文链接http://blog.51cto.com/winthcloud/1895011如需转载请自行联系原作者

Winthcloud