############ 认识nginx #############
Nginx:(发音同 engine x)是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev所开发,最初供俄国大型的入口网站及搜寻引擎Rambler(俄文:Рамблер)使用。  其优点是轻量级(占有内存少),高并发(并发能力强),事实上nginx的并发能力确实在同类型的网页伺服器中表现较好.目前中国大陆使用nginx网站用户有:新浪、网易、 腾讯,另外知名的微网志Plurk也使用nginx


######## 搭建基于nginx的web服务器 ############
1.通常情况下nginx只处理静态的网页请求,即html.如果是来自动态的网页请求,如*.php,则nginx就要根据正则表达式查询路径,然后把*.PHP交给PHP去处理
2.
1)安装make、gcc、源码安装nginx
yum install -y make gcc
tar zxf nginx-1.10.1.tar.gz    ##解压包
cd nginx-1.10.1        ##进入目录

/configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module    ##安装配置

yum install -y pcre-devel    ##在安装配置时,安装缺少的函数库(缺少什么安装什么)pcre是nginx支持具备URI重写功能的rewrite模块
yum install -y openssl-devel    ##在使用HTTPS服务时候必须装openssl-devel

make;make install    ##make进行编译 make install生成文件到系统


ln -s /usr/local/nginx/sbin/nginx /usr/sbin    ##建立软链接,方便之后管理
2)
vim auto/cc/gcc    
# debug
#CFLAGS="$CFLAGS -g"    ##注释debug功能,可减少编译占用资源

vim src/core/nginx.h
#define NGINX_VERSION "1.10.1”
#define NGINX_VER "nginx" ##修改此行,去掉后面的“NGINX_VERSION”,为了安全,这样编译后外界无法获取程序的版本号

3)检查错误:
[root@localhost nginx-1.10.1]# nginx -t    ##检查nginx配置文件是否有语法错误
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

4)开启nginx并查看nginx服务状态
nginx    ##开启nginx
netstat -anlpt|grep 80    ##查看状态

5)浏览器访问:http://172.25.8.1
【注意防火墙:/etc/init.d/iptables stop】

6)
nginx -s reload     ##重新加载nginx服务(现在使用的)
kill -s HUP nginx    ##重新加载配置文件,相当于“killall -1 nginx”(之前使用的)
kill -s QUIT nginx    ##安全退出,相当于“kill -3 nginx”
kill -s TERM nginx    ##快速退出,不等待处理完当前连接


############ nginx的多核配置、进程限制 ############
1.多核配置
cd /usr/local/nginx/conf    ##进入目录
useradd -u 900 -d /usr/local/nginx nginx ##-u指定uid,-d指定目录(如果有就不用建立了)
vim nginx.conf    ##编辑文件
user  nginx nginx;    ##添加该内容,定义nginx的用户和用户组

nginx -t    ##查看nginx服务是否配置成功
nginx -s reload ##重新加载nginx服务
ps aux| grep nginx ##查看nginx进程个数

关闭server1虚拟机,打开虚拟机管理器,将CPU个数添加为两个,点击processor,cpu添加为2个,重新打开server1
lscpu        ##查看CPU个数
vim nginx.conf    ##编辑文件
user  nginx;
worker_processes  2;    ##将work_processes 后接参数改为2  
worker_cpu_affinity 01 10; ##利用多核cpu配置,01 10表示开启两个进程,第一个进程对应第一个CPU内核,第二个进程对应第二个CPU内核
【8核cpu,开启两个进程,举例:: 10101010 01010101; 两组数表示开启了2个进程,位数可对应着cpu个数,10101010表示开启了2,4,6,8内核,01010101表示开启了1,3,5,7内核】

nginx -t    ##查看nginx服务是否配置成功
nginx        ##开启nginx
nginx -s reload    ##重新加载nginx服务
【如果出现nginx: [error] open() "/usr/local/lnmp/nginx/logs/nginx.pid" failed (2: No such file or directory) 则说明nginx没开,使用nginx命令开启】
ps aux| grep nginx ##查看nginx进程个数
返回内容:
root  2567  0.0  0.1  45220  1776 ? Ss 19:51  0:00 nginx: master process nginx
nginx 5261  0.0  0.1  45636  2004 ? S  20:51  0:00 nginx: worker process
nginx 5262  0.0  0.1  45636  1836 ? S  20:51  0:00 nginx: worker process


2.进程限制
1)
su nginx
ulimit  -a    ##查看当前用户进程限制
返回:open files  (-n) 1024
     max user processes    (-u) 1024
2)
su root
vim /etc/security/limits. conf
在最后添加:
nginx    -  nofile  200  ##该用户文件限制为200
nginx    -  nproc   200  ##该用户进程限制为200
3)
su - nginx  切换到该用户
ulimint  -a  来查看
返回内容:
open files  (-n) 200
max user processes    (-u) 200
4)
cd /usr/local/nginx/conf/
vim nginx.conf  ##编辑文件修改参数   
events {
    use epoll;
    worker_connections  1024; ##这里为root的总进程数
}  
##在server位置编添加下列参数
location /status  {    ##/status为状态文件目录
                stub_status on;    ##开启查看nginx状态信息
                access_log off;
        }
5)检查、重新加载
nginx -t    ##查看nginx服务是否配置成功
nginx -s reload    ##重新加载nginx服务
6)测试
curl 172.25.8.1/status   ##命令行测试查看进程数
返回内容:
Active connections: 1
server accepts handled requests
 3 3 4
Reading: 0 Writing: 1 Waiting: 0

ab -n 1000 -c 500 http://172.25.8.1/index.html    ##压力测试,确保已经启动nginx
(-n表示请求次数,1000个进程   -c表示一次请求并发次数,500个)】

curl 172.25.8.1/status   ##再次查看进程数
返回内容:
Active connections: 1         ##表示活跃的连接数
server accepts handled requests    
 1112 1112 1113         ##总共处理了1112个连接,1112次握手,总共处理了1113个请求
Reading: 0 Writing: 1 Waiting: 0 ##Reading读取客户连接数,Writing响应数据到客户端的数量,Waiting正在等候下一次请求指令的驻留连接

############## nginx加密协议https的访问 ##############
1)
vim nginx.conf    ##打开文件去掉下列参数并修改
server {
      listen       443 ssl;
      server_name  server1.example.com;    ##修改为服务器名

      ssl_certificate      cert.pem;
      ssl_certificate_key  cert.pem;    ##修改为cert.pem

      ssl_session_cache    shared:SSL:1m;
      ssl_session_timeout  5m;

      ssl_ciphers  HIGH:!aNULL:!MD5;
      ssl_prefer_server_ciphers  on;

      location / {
          root   html;
          index  index.html index.htm;
        }
    }

2)
cd /etc/pki/tls/certs/
make cert.pem    ##生成这个文件 参数为下
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:Shaanxi
Locality Name (eg, city) [Default City]:xi'an
Organization Name (eg, company) [Default Company Ltd]:redhat
Organizational Unit Name (eg, section) []:linux
Common Name (eg, your name or your server's hostname) []:server1.example.com
Email Address []:[email protected]

mv cert.pem   /usr/local/nginx/conf    ##cert.pem放置在/usr/local/nginx/conf下
3)
nginx -t    ##查看nginx服务是否配置成功
nginx -s reload    ##重新加载nginx服务
4)
浏览器访问https://172.25.8.1(选择 I Unserstand The Risks,添加认证)


########### nginx配置参数的解释 ###########

--prefix=path    定义一个目录,存放服务器上的文件 ,也就是nginx的安装目录。默认使用 /usr/local/nginx。
--sbin-path=path 设置nginx的可执行文件的路径,默认为  prefix/sbin/nginx.
--conf-path=path  设置在nginx.conf配置文件的路径。nginx允许使用不同的配置文件启动,通过命令行中的-c选项。默认为prefix/conf/nginx.conf.
--pid-path=path  设置nginx.pid文件,将存储的主进程的进程号。安装完成后,可以随时改变的文件名 ,在nginx.conf配置文件中使用 PID指令。默认情况下,文件名 为prefix/logs/nginx.pid.
--error-log-path=path 设置主错误,警告,和诊断文件的名称。安装完成后,可以随时改变的文件名 ,在nginx.conf配置文件中 使用 的error_log指令。默认情况下,文件名 为prefix/logs/error.log.
--http-log-path=path  设置主请求的HTTP服务器的日志文件的名称。安装完成后,可以随时改变的文件名 ,在nginx.conf配置文件中 使用 的access_log指令。默认情况下,文件名 为prefix/logs/access.log.
--user=name  设置nginx工作进程的用户。安装完成后,可以随时更改的名称在nginx.conf配置文件中 使用的 user指令。默认的用户名是nobody。
--group=name  设置nginx工作进程的用户组。安装完成后,可以随时更改的名称在nginx.conf配置文件中 使用的 user指令。默认的为非特权用户。
--with-select_module --without-select_module 启用或禁用构建一个模块来允许服务器使用select()方法。该模块将自动建立,如果平台不支持的kqueue,epoll,rtsig或/dev/poll。
--with-poll_module --without-poll_module 启用或禁用构建一个模块来允许服务器使用poll()方法。该模块将自动建立,如果平台不支持的kqueue,epoll,rtsig或/dev/poll。
--without-http_gzip_module 不编译压缩的HTTP服务器的响应模块。编译并运行此模块需要zlib库。
--without-http_rewrite_module  不编译重写模块。编译并运行此模块需要PCRE库支持。
--without-http_proxy_module 不编译http_proxy模块。
--with-http_ssl_module 使用https协议模块。默认情况下,该模块没有被构建。建立并运行此模块的OpenSSL库是必需的。
--with-pcre=path 设置PCRE库的源码路径。PCRE库的源码(版本4.4 - 8.30)需要从PCRE网站下载并解压。其余的工作是Nginx的./ configure和make来完成。正则表达式使用在location指令和 ngx_http_rewrite_module 模块中。
--with-pcre-jit 编译PCRE包含“just-in-time compilation”(1.1.12中, pcre_jit指令)。
--with-zlib=path 设置的zlib库的源码路径。要下载从 zlib(版本1.1.3 - 1.2.5)的并解压。其余的工作是Nginx的./ configure和make完成。ngx_http_gzip_module模块需要使用zlib 。
--with-cc-opt=parameters 设置额外的参数将被添加到CFLAGS变量。例如,当你在FreeBSD上使用PCRE库时需要使用:--with-cc-opt="-I /usr/local/include。.如需要需要增加 select()支持的文件数量:--with-cc-opt="-D FD_SETSIZE=2048".
--with-ld-opt=parameters 设置附加的参数,将用于在链接期间。例如,当在FreeBSD下使用该系统的PCRE库,应指定:--with-ld-opt="-L /usr/local/lib".