安装,服务管理,配置选项...

环境: CentOS

1. 安装

yum install nginx

2. 服务

systemd 的nginx配置文件地址 /lib/systemd/system/nginx.service

[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/usr/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

服务的控制

systemctl start nginx    # nginx 开启
systemctl stop nginx     # 关闭
systemctl restart nginx  # 重启

3. 配置

配置文件地址 /etc/nginx/ 中。

运行用户

user www-data;   

启动进程,通常设置成和cpu的数量相等

worker_processes  1;

全局错误日志及PID文件

error_log  /var/log/nginx/error.log;  
pid        /var/run/nginx.pid;  

events #工作模式及连接数上限

events {  
    use   epoll;             
    # 单个后台 worker process 进程的最大并发链接数  
    worker_connections  1024;
    # multi_accept on;  
}  

epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能。

3.1. 配置 强制域名访问

if ($http_host !~ "^www\.domain\.com$") {
    rewrite ^(.*) http://www.domain.com$1 permanent;
}
if (!-e $request_filename){
    rewrite ^/(.*)$ /index.php/$1 last;
}

3.2. 反向代理

upstream proxyName{
    server 192.168.1.4:8099;
}

location / {
    proxy_pass http://proxyName;
    proxy_redirect          default ;
    proxy.conf
    proxy_set_header        Host            $host;
    proxy_set_header        X-Real-IP       $remote_addr;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    client_max_body_size    10m;
    client_body_buffer_size 128k;
    proxy_connect_timeout   90;
    proxy_send_timeout      90;
    proxy_read_timeout      90;
    proxy_buffers           32 4k;
}

3.2.1. 404

为php节点添加

try_files $uri =404;

4. htpasswd HTTP验证

安装 apache2-utils

使用apache htpasswd来创建用户登陆访问

创建一个用户密码文件

cd /var/www/mywebsite.com/
htpasswd -c htpasswd.mywebsite username
# username 密码输入
# 继续创建
htpasswd htpasswd.mywebsite user2
...

修改 htpasswd.mywebsite文件的对应权限,并保证nginx用户可以访问该文件的路径。

sudo chown http:http htpasswd.mywebsite
sudo chmod 640 htpasswd.mywebsite

上面的 http:http 为 nginx的进程用户,修改为自己系统的默认。

添加到配置

auth_basic "Restricted 限制注释";
auth_basic_user_file /var/www/mywwebsite.com/htpasswd.mywebsite;

5. error

查看错误日志/var/log/nginx/error.log

错误502

upstream sent too big header while reading response header from upstream

fastcgi_buffer_size 128k;
fastcgi_buffers 32 32k;

fastcgi_* 可以理解成nginx接受client请求时的响应使用的。proxy是nginx作为client转发时使用的,如果header过大,超出了默认的1k,就会引发上述的 upstream sent too big header。

6. 盗链

常见的防盗链设置如下:

location ~* \.(gif|jpg|png|swf|flv)$ {
    valid_referers none blocked www.demo1.com www.demo2.net;
    if ($invalid_referer) {
        rewrite ^/ http://www.demo1.com/403.html;
        #return 404;
    }
    expires 3d;
}

第一行表示对gif、jpg、png、swf、flv后缀的文件实行防盗链

第二行表示对两个域名这两个来路进行判断

if{}里面内容意思是:如果来入不是指定判断的来路时跳转到错误页面。

7. Access-Control-Allow-Origin

add_header Access-Control-Allow-Origin *;

8. 上传

client_max_body_size 35m;        #客户端上传文件大小设为35M

9. 连接数

worker_rlimit_nofile 注意:设置了这个后,你修改worker_connections值时,是不能超过worker_rlimit_nofile的这个值,不然又会有前面的那个warn提示。 保存配置文件,退出重启nginx。

如果nginx 中worker_connections 值设置是1024,worker_processes 值设置是4,按反向代理模式下最大连接数的理论计算公式: 最大连接数 = worker_processes * worker_connections/4 查看相关资料,生产环境中worker_connections 建议值最好超过9000,计划将一台nginx 设置为10240,再观察一段时间。

10. 隐藏版本号

server_tokens off;

php 则 expose_php = Off

11. DEMO NGINX 配置

#运行用户
user www-data;   
#启动进程,通常设置成和cpu的数量相等
worker_processes  1;

#全局错误日志及PID文件
error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

#工作模式及连接数上限
events {
    use   epoll;              #epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能
    worker_connections  1024; #单个后台worker process进程的最大并发链接数
    # multi_accept on;
}

#设定http服务器,利用它的反向代理功能提供负载均衡支持
http {
    #设定mime类型,类型由mime.type文件定义
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    #设定日志格式
    access_log    /var/log/nginx/access.log;

    #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用,
    #必须设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.
    sendfile        on;
    #tcp_nopush     on;

    #连接超时时间
    #keepalive_timeout  0;
    keepalive_timeout  65;
    tcp_nodelay        on;
    
    #开启gzip压缩
    gzip  on;
    gzip_disable "MSIE [1-6]\.(?!.*SV1)";

    #设定请求缓冲
    client_header_buffer_size    1k;
    large_client_header_buffers  4 4k;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;

    #设定负载均衡的服务器列表
    upstream mysvr {
        #weigth参数表示权值,权值越高被分配到的几率越大
        #本机上的Squid开启3128端口
        server 192.168.8.1:3128 weight=5;
        server 192.168.8.2:80  weight=1;
        server 192.168.8.3:80  weight=6;
    }

    # 服务
    server {
        #侦听80端口
        listen       80;
        #定义使用www.xx.com访问
        server_name  www.xx.com;

        #设定本虚拟主机的访问日志
        access_log  logs/www.xx.com.access.log  main;

        #默认请求
        location / {
            root   /root;      #定义服务器的默认网站根目录位置
            index index.php index.html index.htm;   #定义首页索引文件的名称

            fastcgi_pass  www.xx.com;
            fastcgi_param  SCRIPT_FILENAME  $document_root/$fastcgi_script_name;
            include /etc/nginx/fastcgi_params;
        }

        # 定义错误提示页面
        error_page   500 502 503 504 /50x.html; 
            location = /50x.html {
            root   /root;
        }

        #静态文件,nginx自己处理
        location ~ ^/(images|javascript|js|css|flash|media|static)/ {
            root /var/www/virtual/htdocs;
            #过期30天,静态文件不怎么更新,过期可以设大一点,如果频繁更新,则可以设置得小一点。
            expires 30d;
        }
        #PHP 脚本请求全部转发到 FastCGI处理. 使用FastCGI默认配置.
        location ~ \.php$ {
            root /root;
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME /home/www/www$fastcgi_script_name;
            include fastcgi_params;
        }
        #设定查看Nginx状态的地址
        location /NginxStatus {
            stub_status            on;
            access_log              on;
            auth_basic              "NginxStatus";
            auth_basic_user_file  conf/htpasswd;
        }
        #禁止访问 .htxxx 文件
        location ~ /\.ht {
            deny all;
        }
    
    }
}

12. PHP 上传限制

12.1. php.ini

; 开启上传
file_uploads = On

; 上传暂存目录
;upload_tmp_dir =

; 上传文件最大值
upload_max_filesize = 120M

; 一次性上传文件数量
max_file_uploads = 20

12.2. nginx

# 上传文件最大值
client_max_body_size 120M;  
# 设置临时目录
# client_body_temp_path /home/www/nginx_temp;