标签归档:FastCGI

Centos 7源代码安装配置 Apache 生产篇

什么是Apache?

Apache是​​互联网上最流行的网络web服务器。全球一半以上网站都是使用Apache作为服务器。其也是一个工业级的 Web服务器。

在本文中我主要介绍如何安装Apache HTTP服务器,你只要按照本教程的步骤操作,一定可以安装成功,需要说明的是,如果你只安装Apache,而不安装php,请在配置文件中,删除 FilesMatch 包含的内容,否则会报错找不到PHP。

如果你需要安装PHP/Mysql数据库,那么本站教程太适合你了,关于php和mysql的安装,请阅读:11、12步骤。

说明:本文教程适用于生产环境,Apache是基于FPM/FastCGI解析的PHP。

系统环境:Centos 7.4 Apache 2.4.29

1.更新系统

$ yum update && yum upgrade -y

2.安装扩展包以及依赖包

$ yum install epel-release -y
$ yum install gcc gcc-c++ openssl openssl-devel libtool expat-devel zlib-devel python-devel -y

3.安装pcre

$ wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.41.tar.gz
$ tar zxvf pcre-8.41.tar.gz
$ cd pcre-8.41
$ ./configure
$ make -j8 && make install

4.安装nghttp2

$ wget //github.com/nghttp2/nghttp2/releases/download/v1.27.0/nghttp2-1.27.0.tar.gz
$ tar zxvf nghttp2-1.27.0.tar.gz
$ cd nghttp2-1.27.0
$ ./configure
$ make -j8 && make install
$ echo '/usr/local/lib' > /etc/ld.so.conf.d/local.conf
$ ldconfig

5.安装Apache httpd

创建用户与组并下载httpd apr apr-util安装包:

$ groupadd www
$ useradd -g www www
$ cd /tmp
$ wget //mirrors.shuosc.org/apache//httpd/httpd-2.4.29.tar.gz
$ wget //mirrors.tuna.tsinghua.edu.cn/apache//apr/apr-1.6.3.tar.gz
$ wget //mirrors.tuna.tsinghua.edu.cn/apache//apr/apr-util-1.6.1.tar.gz

解压相关包:

$ tar xvf httpd-2.4.29.tar.gz
$ tar xvf apr-1.6.3.tar.gz
$ tar xvf apr-util-1.6.1.tar.gz

apr-1.6.3apr-util-1.6.1移动到httpd-2.4.29/srclib目录下。操作如下:

$ cd httpd-2.4.29
$ cp -R ../apr-1.6.3 srclib/apr
$ cp -R ../apr-util-1.6.1 srclib/apr-util

注意:移动不准带版本号,否则编译安装时找不到库。

开始安装:

$ ./configure \
--prefix=/usr/local/apache \
--enable-mods-shared=most \
--enable-headers \
--enable-mime-magic \
--enable-proxy \
--enable-so \
--enable-rewrite \
--with-ssl \
--with-nghttp2 \
--enable-ssl \
--enable-deflate \
--with-pcre \
--with-included-apr \
--with-apr-util \
--enable-mpms-shared=all \
--with-mpm=prefork \
--enable-remoteip \
--enable-http2 \
--enable-dav \
--enable-expires \
--enable-static-support \
--enable-suexec \
--enable-modules=all \
$ make -j8 && make install

安装完成。

6.配置httpd.conf

$ cd /usr/local/apache/conf
$ vim httpd.conf

除默认配置外,请取消以下注释,开启相关模块:

LoadModule ext_filter_module modules/mod_ext_filter.so
LoadModule deflate_module modules/mod_deflate.so
LoadModule expires_module modules/mod_expires.so
LoadModule remoteip_module modules/mod_remoteip.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
LoadModule proxy_scgi_module modules/mod_proxy_scgi.so
LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_express_module modules/mod_proxy_express.so
LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
LoadModule ssl_module modules/mod_ssl.so
LoadModule http2_module modules/mod_http2.so
LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so
LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so
LoadModule lbmethod_heartbeat_module modules/mod_lbmethod_heartbeat.so
LoadModule suexec_module modules/mod_suexec.so
LoadModule rewrite_module modules/mod_rewrite.so

在模块结尾部分添加如下内容:

<IfModule http2_module>
ProtocolsHonorOrder On
Protocols h2 http/1.1
</IfModule>

修改以下参数配置

将用户组设置为:

User www
Group www

默认值:

#ServerName www.example.com:80

修改为:

ServerName 0.0.0.0:80

注意:如果基于端口创建虚拟主机,请换行加端口,然后在虚拟主机配置文件中指定端口即可。

将配置文件中的所有:

AllowOverride None

修改为:

AllowOverride All

在以下内容位置:

AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz

添加:

AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

取消以下注释并添加apache支持python:

AddHandler cgi-script .cgi .py

取消以下注释:

Include conf/extra/httpd-mpm.conf
Include conf/extra/httpd-vhosts.conf
Include conf/extra/httpd-default.conf

以下内容在文件尾部添加

开启GZIP:

<IfModule mod_headers.c>
 AddOutputFilterByType DEFLATE text/html text/plain text/css text/xml text/javascript
 <FilesMatch "\.(js|css|html|htm|png|jpg|swf|pdf|shtml|xml|flv|gif|ico|jpeg)$">
 RequestHeader edit "If-None-Match" "^(.*)-gzip(.*)$" "$1$2"
 Header edit "ETag" "^(.*)-gzip(.*)$" "$1$2"
 </FilesMatch>
 DeflateCompressionLevel 6
 SetOutputFilter DEFLATE
</IfModule>

设置apache安全:

ProtocolsHonorOrder On
PidFile /usr/local/apache/logs/httpd.pid
ServerTokens ProductOnly
ServerSignature Off

引入虚拟主机配置文件:

IncludeOptional conf/vhost/*.conf

7.创建目录及虚拟主机配置文件

$ mkdir -p /usr/local/apache/conf/vhost
$ mkdir -p /data/apps/web/renwolecom
$ vim /usr/local/apache/conf/vhost/renwolecom.conf

插入以下内容:

<VirtualHost *:80>
 ServerAdmin webmaster@example.com
 DocumentRoot "/data/apps/web/renwolecom"
 ServerName www.renwole.com
 ServerAlias renwole.com
 errorDocument 404 /404.html
 ErrorLog "/usr/local/apache/logs/renwolecom-error_log"
 CustomLog "/usr/local/apache/logs/renwolecom-access_log" combined

<FilesMatch \.php$>
 SetHandler "proxy:unix:/tmp/php-cgi.sock|fcgi://localhost"
 </FilesMatch>

<Directory "/data/apps/web/renwolecom">
 SetOutputFilter DEFLATE
 Options FollowSymLinks
 AllowOverride All
 Require all granted
 DirectoryIndex index.php index.html index.htm default.php default.html default.htm
 </Directory>
</VirtualHost>

以上内容请根据自己的网站实际路径修改。

说明:如果没有域名,请将域名绑定部分修改为127.0.0.1,在http.conf中添加其他端口即可实现IP+端口访问,要记得防火墙放行端口。

注意:建议清空httpd-vhosts.conf中的内容,或者不开启引用,否则重启httpd服务时会有警告,但不影响使用,主要原因是找到默认配置中的网站目录路径。

8.创建system系统单元启动文件

$ vim /usr/lib/systemd/system/httpd.service

添加以下内容:

[Unit]
Documentation=man:systemd-sysv-generator(8)
SourcePath=/usr/local/apache/bin/apachectl
Description=LSB: starts Apache Web Server
Before=runlevel2.target
Before=runlevel3.target
Before=runlevel4.target
Before=runlevel5.target
Before=shutdown.target
After=all.target
After=network-online.target
Conflicts=shutdown.target

[Service]
Type=forking
Restart=no
TimeoutSec=5min
IgnoreSIGPIPE=no
KillMode=process
GuessMainPID=no
RemainAfterExit=yes
ExecStart=/usr/local/apache/bin/apachectl start
ExecStop=/usr/local/apache/bin/apachectl stop

9.加入开机自启/启动/停止/重启

$ systemctl enable httpd
$ systemctl start httpd
$ systemctl stop httpd
$ systemctl restart httpd

10.设置Firewalld防火墙

$ firewall-cmd --permanent --zone=public --add-service=http
$ firewall-cmd --permanent --zone=public --add-service=https
$ firewall-cmd --reload

接下来你就可以使用域名或IP访问你的网站了。

11.部署PHP篇

请参阅《Centos 7源码编译安装 php7.1 生产篇

12.部署Mysql篇

请参阅《Centos 7二进制安装配置 MariaDB(MySQL)数据库

Apache HTTP服务器的安装与配置至此已经结束,如果在安装配置过程中出现任何报错,请查看/usr/local/apache/logs/下的错误日志,以便你能快速解决所遇到的问题。

若还有其他指教,欢迎你的留言。

最佳 Nginx 配置文件优化方案

以下是生产环境中适用的Nginx优化文件,你也可以根据自己的需求调优。

 user www www;
 #用户&组
 worker_processes auto;
 #通常是CPU核的数量存储数据的硬盘数量及负载模式,不确定时将其设置为可用的CPU内核数(设置为“auto”将尝试自动检测它)
 error_log /usr/local/nginx/logs/error.log crit;
 pid /usr/local/nginx/logs/nginx.pid;
 #指定pid文件的位置,默认值就可以

 worker_rlimit_nofile 65535;
 #更改worker进程的最大打开文件数限制
 events {
 use epoll;
 multi_accept on;
 #在Nginx接到一个新连接通知后,调用accept()来接受尽量多的连接
 worker_connections 65535;
 #最大访问客户数,修改此值时,不能超过 worker_rlimit_nofile 值
 }
 http {
 include mime.types;
 default_type application/octet-stream;
 #使用的默认的 MIME-type
 log_format '$remote_addr - $remote_user [$time_local] "$request" '
 '$status $body_bytes_sent "$http_referer" '
 '"$http_user_agent" "$http_x_forwarded_for"';
 #定义日志格式
 charset UTF-8;
 #设置头文件默认字符集
 server_tokens off;
 #Nginx打开网页报错时,关闭版本号显示
 access_log off;
 sendfile on;
 tcp_nopush on;
 #告诉nginx在一个数据包里发送所有头文件,而不一个接一个的发送
 tcp_nodelay on;
 #是否启用 nagle 缓存算法,告诉nginx不要缓存数据
 sendfile_max_chunk 512k;
 #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限
 keepalive_timeout 65;
 #HTTP连接持续时间,值越大无用的线程变的越多,0:关闭此功能,默认为75
 client_header_timeout 10;
 client_body_timeout 10;
 #以上两项是设置请求头和请求体各自的超时时间
 reset_timedout_connection on;
 #告诉nginx关闭不响应的客户端连接
 send_timeout 30;
 #客户端响应超时时间,若客户端停止读取数据,释放过期的客户端连接,默认60s
 limit_conn_zone $binary_remote_addr zone=addr:5m;
 #用于保存各种key,如:当前连接数的共享内存的参数,5m是5兆字节,这个值应该被设置的足够大,以存储(32K*5)32byte状态或者(16K*5)64byte状态
 limit_conn addr 100;
 #key最大连接数,这里key是addr,我设置的值是100,这样就允许每个IP地址最多同时打开100个连接数
 server_names_hash_bucket_size 128;
 #nginx启动出现could not build the server_names_hash, you should increase错误时,请提高这个参数的值一般设成64就够了
 client_body_buffer_size 10K;
 client_header_buffer_size 32k;
 #客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小进行设置
 large_client_header_buffers 4 32k;
 client_max_body_size 8m;
 #上传文件大小设置,一般是动态应用类型

 #线程池优化,使用--with-threads配置参数编译
 #aio threads;
 #thread_pool default threads=32 max_queue=65536;
 #aio threads=default;
 #关于更多线程请点击查看

 #fastcgi性能调优

 fastcgi_connect_timeout 300;
 #连接到后端 Fastcgi 的超时时间
 fastcgi_send_timeout 300;
 #与 Fastcgi 建立连接后多久不传送数据,就会被自动断开
 fastcgi_read_timeout 300;
 #接收 Fastcgi 应答超时时间
 fastcgi_buffers 4 64k;
 #可以设置为 FastCGI 返回的大部分应答大小,这样可以处理大部分请求,较大的请求将被缓冲到磁盘
 fastcgi_buffer_size 64k;
 #指定读取 Fastcgi 应答第一部分需要多大的缓冲区,可以设置gastcgi_buffers选项指定的缓冲区大小
 fastcgi_busy_buffers_size 128k;
 #繁忙时的buffer,可以是fastcgi_buffer的两倍
 fastcgi_temp_file_write_size 128k;
 #在写入fastcgi_temp_path时将用多大的数据块,默认值是fastcgi_buffers的两倍,该值越小越可能报 502 BadGateway
 fastcgi_intercept_errors on;
 #是否传递4**&5**错误信息到客户端,或允许nginx使用error_page处理错误信息.

 #fastcgi_cache配置优化(若是多站点虚拟主机,除fastcgi_cache_path(注意keys_zone=名称)全部加入php模块中)

 fastcgi_cache fastcgi_cache;
 #开启FastCGI缓存并指定一个名称,开启缓存可以降低CPU的负载,防止502错误出现
 fastcgi_cache_valid 200 302 301 1h;
 #定义哪些http头要缓存
 fastcgi_cache_min_uses 1;
 #URL经过多少次请求将被缓存
 fastcgi_cache_use_stale error timeout invalid_header http_500;
 #定义哪些情况下用过期缓存
 #fastcgi_temp_path /usr/local/nginx/fastcgi_temp;
 fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=fastcgi_cache:15m inactive=1d max_size=1g;
 #keys_zone=缓存空间的名字,cache=用多少内存,inactive=默认失效时间,max_size=最多用多少硬盘空间。
 #缓存目录,可以设置目录层级,举例:1:2会生成16*256个字目录
 fastcgi_cache_key $scheme$request_method$host$request_uri;
 #定义fastcgi_cache的key
 #fastcgi_ignore_headers Cache-Control Expires Set-Cookie;

 #响应头

 add_header X-Cache $upstream_cache_status;
 #缓存命中
 add_header X-Frame-Options SAMEORIGIN;
 #是为了减少点击劫持(Clickjacking)而引入的一个响应头
 add_header X-Content-Type-Options nosniff;

 #GZIP性能优化

 gzip on;
 gzip_min_length 1100;
 #对数据启用压缩的最少字节数,如:请求小于1K文件,不要压缩,压缩小数据会降低处理此请求的所有进程速度
 gzip_buffers 4 16k;
 gzip_proxied any;
 #允许或者禁止压缩基于请求和响应的响应流,若设置为any,将会压缩所有请求
 gzip_http_version 1.0;
 gzip_comp_level 9;
 #gzip压缩等级在0-9内,数值越大压缩率越高,CPU消耗也就越大
 gzip_types text/plain text/css application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript application/json image/jpeg image/gif image/png;
 #压缩类型
 gzip_vary on;
 #varyheader支持,让前端的缓存服务器识别压缩后的文件,代理
 include /usr/local/nginx/conf/vhosts/*.conf;
 #在当前文件中包含另一个文件内容的指令

 #静态文件的缓存性能调优

 open_file_cache max=65535 inactive=20s;
 #这个将为打开文件指定缓存,max 指定缓存数量.建议和打开文件数一致.inactive 是指经过多长时间文件没被请求后删除缓存
 open_file_cache_valid 30s;
 #这个是指多长时间检查一次缓存的有效信息,例如我一直访问这个文件,30秒后检查是否更新,反之更新
 open_file_cache_min_uses 2;
 #定义了open_file_cache中指令参数不活动时间期间里最小的文件数
 open_file_cache_errors on;
 #NGINX可以缓存在文件访问期间发生的错误,这需要设置该值才能有效,如果启用错误缓存.则在访问资源(不查找资源)时.NGINX会报告相同的错误

 #资源缓存优化
 server {

 #防盗链设置

 location ~* \.(jpg|gif|png|swf|flv|wma|asf|mp3|mmf|zip|rar)$ {
 #防盗类型
 valid_referers none blocked *.renwole.com renwole.com;
 #none blocked参数可选.允许使用资源文件的域名
 if ($invalid_referer) {
 return 403;
 #rewrite ^/ //renwole.com
 #若不符合条件域名,则返回403或404也可以是域名
 }
 }
 location ~ .*\.(js|css)$ {
 access_log off;
 expires 180d;
 #健康检查或图片.JS.CSS日志.不需要记录日志.在统计PV时是按照页面计算.而且写入频繁会消耗IO.
 }
 location ~* ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|swf|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
 access_log off;
 log_not_found off;
 expires 180d;
 #视图&元素很少改变.可将内容缓存到用户本地.再次访问网站时就无需下载.节省流量.加快访问速度.缓存180天
 }
 }
 server {
 listen 80 default_server;
 server_name .renwole.com;
 rewrite ^ //renwole.com$request_uri?;
 }
 server {
 listen 443 ssl http2 default_server;
 listen [::]:443 ssl http2;
 server_name .renwole.com;
 root /home/web/renwole;
 index index.html index.php;

 ssl_certificate /etc/letsencrypt/live/renwole.com/fullchain.pem;
 ssl_certificate_key /etc/letsencrypt/live/renwole.com/privkey.pem;

 ssl_dhparam /etc/nginx/ssl/dhparam.pem;
 ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
 ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';

 ssl_session_cache shared:SSL:50m;
 ssl_session_timeout 1d;
 ssl_session_tickets off;
 ssl_prefer_server_ciphers on;
 add_header Strict-Transport-Security max-age=15768000;
 ssl_stapling on;
 ssl_stapling_verify on;

 include /usr/local/nginx/conf/rewrite/wordpress.conf;
 access_log /usr/local/nginx/logs/renwole.log;

 location ~ \.php$ {
 root /home/web/renwole;
 #fastcgi_pass 127.0.0.1:9000;
 fastcgi_pass unix:/var/run/www/php-cgi.sock;
 fastcgi_index index.php;
 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
 include fastcgi_params;
 }
 }
 }

以上就是本站所使用的环境优化情况,如你有更好的方案不妨分享出来。如有什么有不足之处,还请谅解。

更多模块了解,请参阅//nginx.org/en/docs/