配置生产环境
1. 安装 nginx
#安装nginx官方版本yum install nginx #或安装带 Pagespeed 的 nginxyum install ulyaoth-nginx-mainline-pagespeed systemctl enable nginx #随系统启动systemctl start nginx #启动服务
2. 安装 php
yum install php php-fpm php-mysql php-pdo php-gd php-intl php-bcmath php-cli php-mbstring php-mcrypt php-pecl-zipsystemctl start php-fpm #启动服务systemctl enable php-fpm #随系统启动
安装 Zend Opcache 缓存扩展
yum install php-opcache
如果 httpd 服务启动了, 停用此服务
systemctl disable httpd #禁止随系统启动systemctl stop httpd #停用服务
为了避免 nginx 与 php-fpm 使用中出现权限不足的问题(例如 wordpress 自动更新时要求授权), 建议将 nginx 与 php-fpm 的执行帐户统一, 且不允许该帐户登录系统, 且只允许操作 html 目录.
查看当前所有用户和用户组
#查看用户cat /etc/passwd#查看用户组cat /etc/group
添加一个web相关服务公用帐户并创建一个公用组, 以备后面使用.
#新建名为 webroot 的用户组groupadd webroot #添加一个名为 webroot 的帐户, 不允许登录系统. 并加入到 webroot 用户组.useradd -g webroot -s /sbin/nologin webroot #查看某用户所属的用户组groups webroot
将 nginx 的 html 目录所有者改为 webroot, 用户组改为 webroot
chown -R webroot:webroot /usr/share/nginx/html
配置 Nginx
nano /etc/nginx/nginx.conf
修改为
#上一步中新增的用户名user webroot;#nginx 使用的线程数, cpu核数 * 2 最佳.worker_processes 2;#并发请求时使用线程的顺序, 用二进制位表示.worker_cpu_affinity 01 10; error_log /var/log/nginx/error.log warn;pid /var/run/nginx.pid; events { #最大连接数 worker_connections 1024; #允许 Nginx 在已经得到一个新连接的通知时接收尽可能更多的连接 multi_accept on;} http { include /etc/nginx/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 /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #启用 gzip 压缩 gzip on; gzip_vary on; gzip_http_version 1.1; gzip_min_length 1k; gzip_buffers 4 8k; gzip_comp_level 2; gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript image/svg+xml; include /etc/nginx/conf.d/*.conf;}
各选项说明
gzip on;
该指令用于开启或关闭gzip模块(on/off)gzip_http_version 1.1;
识别http的协议版本(1.0/1.1)gzip_min_length 1k;
设置允许压缩的页面最小字节数,页面字节数从header头得content-length中进行获取。默认值是0,不管页面多大都压缩。建议设置成大于1k的字节数,小于1k可能会越压越大。gzip_buffers 4 8k;
设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。 例如 4 4k 代表以4k为单位,按照原始数据大小以4k为单位的4倍申请内存。 4 8k 代表以8k为单位,以8k为单位的4倍申请内存。gzip_comp_level 2;
gzip压缩比,1压缩比最小处理速度最快,9压缩比最大但处理速度最慢(传输快但比较消耗cpu)gzip_types text/plain text/css
application/x-javascript text/xml
application/xml application/xml+rss
指定要压缩的 mime 类型. 无论是否指定, ”text/html” 类型总是会被压缩的.gzip_vary on;
由于客户端和服务端之间可能存在一个或多个中间实体(如缓存服务器),有些实现得有 BUG 的缓存服务器,会忽略响应头中的 Content-Encoding,从而可能给不支持压缩的客户端返回缓存的压缩版本.
有两个方案可以避免这种情况发生:nginx 使用第二种方案.
将响应头中的 Cache-Control 字段设为 private,告诉中间实体不要缓存它.
增加 Vary: Accept-Encoding 响应头,明确告知缓存服务器按照 Accept-Encoding 字段的内容,分别缓存不同的版本.
启用 https
请参考 <<CentOS 7 Nginx Let’ s Encrypt SSL 证书安装配置>>
设置默认虚拟主机
找到 server 节中的 listen 参数, 在端口后面加入 default 表示此虚拟主机为默认值, 当找不到配置 server_name 虚拟主机时会使用这里的默认虚拟主机.
server { listen 80 default; server_name localhost; #以下省略}
添加默认首页, 找到以下内容
location / { root html; index index.html index.htm;}
将 root 提到 location 外层, 成为全局设置.
在 index 项中加入 index.php 类型
root /usr/share/nginx/html; location / { index index.html index.htm index.php;}
使用 php-fpm
location ~ .php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $request_filename; #或者像下面这样也是可以的 #fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params;}
禁止访问 .htxxx 文件
location ~ /.ht { deny all;}
设置静态文件缓存时间
在 location 下方加入下面的配置
#设置静态文件过期时间为10天location ~ .*.(gif|jpg|jpeg|png|bmp|swf)${ expires 10d;} #设置js, css文件过期时间为1天location ~ .*.(js|css)?${ expires 1d;}
最后的样子如下
server { listen 80 default; server_name localhost; root /usr/share/nginx/html; charset utf-8; #access_log /var/log/nginx/log/host.access.log main; location / { index index.php 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 /usr/share/nginx/html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ .php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # location ~ .php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $request_filename; include fastcgi_params; } # deny access to .htaccess files, if Apache's document root # concurs with nginx's one location ~ /.ht { deny all; } location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$ { expires 10d; } location ~ .*.(js|css)?$ { expires 1d; }}
保存退出
配置 php
nano /etc/php.ini#将允许上传的最大值改为20M(根据需求定).post_max_size = 20Mupload_max_filesize = 20M
配置 php-fpm
nano /etc/php-fpm.d/www.conf#修改用户名和用户组, 优化参数.user = webrootgroup = webroot pm.max_children = 20pm.start_servers = 5pm.min_spare_servers = 5pm.max_spare_servers = 20pm.max_requests = 120
保存退出
重启 Nginx 与 php-fpm 服务
systemctl restart nginxsystemctl restart php-fpm
在 /usr/share/nginx/html 中新建 phpinfo.php 文件
nano /usr/share/nginx/html/phpinfo.php<?php phpinfo();?>
保存退出
暂时关闭防火墙, 待所有服务配置完成后统一设置防火墙.
systemctl stop iptablessystemctl stop firewalld #如果使用 firewallD 防火墙, 则是这样关闭
如能在浏览器中使用 ip 访问, 说明安装成功.
3. 安装 MariaDB 数据库
yum install mariadb-server mariadb-client#如果出示包冲突, 可能是因为已经安装了 mysql 相关的包, 应先卸载.yum remove mysql*#然后再次安装即可.systemctl enable mariadb #随系统启动systemctl start mariadb #启动服务#查询当前所有用户mysqluse mysql;select host,user,password from user;#增加新用户: grant 权限 on 数据库.* to 用户名@登录主机 identified by “密码”mysqlgrant <select,insert,update,delete|all> on *.* to user1@'%' identified by "password1";flush privileges;#如果你不想user1有密码,可以再打一个命令将密码去掉。mysqlgrant <select,insert,update,delete|all> on *.* to user1@'%' identified by "";flush privileges;quit
根据服务器配置优化 MariaDB
根据内存大小选择示例配置文件(位于 /usr/share/mysql/ 中, 以 my-xxxx.cnf 命名), 复制到 /etc/my.cnf.d/ 中, 然后高速参数配置. 我的服务器内存为 512M, 因此选择 my-large.cnf.
cp /usr/share/mysql/my-large.cnf /etc/my.cnf.d/myserver.cnfnano /etc/my.cnf.d/myserver.cnf#去掉 innodb 前的”#”号以启用 InnoDB 引擎, 优化各项参数[client]default-character-set = utf8 [mysqld]#将默认引擎改为 innodbdefault-storage-engine = innodbcharacter-set-server=utf8 port = 3306socket = /var/lib/mysql/mysql.sockskip-external-lockingkey_buffer_size = 96Mmax_allowed_packet = 4Mtable_open_cache = 512sort_buffer_size = 2Mread_buffer_size = 2Mread_rnd_buffer_size = 4Mmyisam_sort_buffer_size = 64Mthread_cache_size = 8query_cache_size= 32M# Try number of CPU's*2 for thread_concurrencythread_concurrency = 2 innodb_data_home_dir = /var/lib/mysqlinnodb_data_file_path = ibdata1:10M:autoextendinnodb_log_group_home_dir = /var/lib/mysql# You can set .._buffer_pool_size up to 50 - 80 %# of RAM but beware of setting memory usage too highinnodb_buffer_pool_size = 96Minnodb_additional_mem_pool_size = 20M# Set .._log_file_size to 25 % of buffer pool sizeinnodb_log_file_size = 64Minnodb_log_buffer_size = 8M#日志先写到磁盘缓存, 再写到磁盘, 而不是强制写入磁盘innodb_flush_log_at_trx_commit = 2innodb_lock_wait_timeout = 50
保存退出, 重启 MariaDB.
systemctl restart mariadb
如果遇到无法启动的情况, 可能是因为 InnoDB 中设置的日志文件大小与实际存在的大小不一至. 因为这里是新安装的数据库, 所以直接删除已经存在的日志文件, 重启后会生成新的. 如果是有重要数据的数据库, 则应修改配置值为原文件相应大小.
https://blog.itnmg.net/2015/03/11/centos-7-lnmp-ftp/