linux+httpd+php-fpm+mysql
rpm包的安裝方式
環(huán)境:
系統(tǒng): CentOS Linux release 7.1.1503 (Core)
yum源:epel,cdrom
主機(jī):
httpd | 172.16.40.40 |
php-fpm | 172.16.40.41 |
mysql | 172.16.40.42 |
目的:
1、三臺主機(jī)實現(xiàn)httpd、php和mysql服務(wù)。
2、httpd提供兩個虛擬主機(jī),一個虛擬主機(jī)提供phpMyAdmin,另一個虛擬主機(jī)提供wordpress。
3、為php安裝xcache。
4、添加status頁面(包含php的),并使用用戶認(rèn)證。
目錄:
一、httpd
二、php
三、mysql
四、安裝phpMyadmin和wordpress
五、添加status頁面。
所有主機(jī)selinux,iptables關(guān)閉狀態(tài)。
一、httpd.
[root@localhost ~]# yum install httpd -y [root@localhost ~]# mkdir -pv /web/vhosts/{blog,phpmyadm} [root@localhost ~]# mkdir -pv /var/log/httpd/{blog,phpmyadm} [root@localhost ~]# cd /etc/httpd [root@localhost httpd]# vim conf/httpd.conf #DocumentRoot "/var/www/html" #關(guān)閉中心主機(jī) DirectoryIndex index.php index.html #修改默認(rèn)文檔查找次序添加虛擬主機(jī):
[root@localhost httpd]# vim conf.d/vhosts.conf <VirtualHost *:80> ServerName www.star.com DocumentRoot /web/vhosts/blog CustomLog "/var/log/httpd/blog/access_log" combined ErrorLog "/var/log/httpd/blog/error_log" <Directory "/web/vhosts/blog"> Options None Require all granted </Directory> </VirtualHost> <VirtualHost *:80> ServerName myadm.star.com DocumentRoot /web/vhosts/phpmyadm CustomLog "/var/log/httpd/phpmyadm/access_log" combined ErrorLog "/var/log/httpd/phpmyadm/error_log" <Directory "/web/vhosts/phpmyadm"> Options None Require all granted </Directory> </VirtualHost>來兩個網(wǎng)頁文件測試下:
[root@localhost httpd]# vim /web/vhosts/phpmyadm/index.html <h2>myadm.star.com</h2> [root@localhost httpd]# vim /web/vhosts/blog/index.html <h2>www.star.com</h2> [root@localhost httpd]# systemctl restart httpd測試沒問題。
指定.php頁面的處理方式。
[root@localhost httpd]# vim conf/httpd.conf AddType application/x-httpd-php .php AddType application/x-httpd-php-source .phps修改vhosts.conf文件
ProxyRequests Off #關(guān)閉正向代理 <VirtualHost *:80> ServerName www.star.com DocumentRoot /web/vhosts/blog CustomLog "/var/log/httpd/blog/access_log" combined ErrorLog "/var/log/httpd/blog/error_log" ProxyPassMatch ^/(.*\.php)$ fcgi://172.16.40.41:9000/web/php/blog/$1 #匹配頁面代理至后端。 <Directory "/web/vhosts/blog"> Options None Require all granted </Directory> </VirtualHost> <VirtualHost *:80> ServerName myadm.star.com DocumentRoot /web/vhosts/phpmyadm CustomLog "/var/log/httpd/phpmyadm/access_log" combined ErrorLog "/var/log/httpd/phpmyadm/error_log" ProxyPassMatch ^/(.*\.php)$ fcgi://172.16.40.41:9000/web/php/phpmyadm/$1 <Directory "/web/vhosts/phpmyadm"> Options None Require all granted </Directory> </VirtualHost>[root@localhost httpd]# systemctl reload httpd注意上面?zhèn)鹘ophp的路徑不用與本地httpd的路徑相同。只要在那個路徑可以找到應(yīng)該找到的php文件即可。
只要是php文件,都會轉(zhuǎn)給php-fpm服務(wù)器。而其它靜態(tài)資源都會由httpd來響應(yīng)。所以這是兩臺相互獨立的服務(wù)器(資源也是獨立的)。 不過因為我們這里的應(yīng)用也沒必要再把資源切分開,所以就直接復(fù)制到php主機(jī)一份了。
只不過在httpd主機(jī)上只會拿這個應(yīng)用中的靜態(tài)資源。 在php上只會拿php資源。
二、php
[root@localhost ~]# yum install php-fpm php-mysql[root@localhost ~]# rpm -ql php-fpm /etc/logrotate.d/php-fpm #日志滾動配置 /etc/php-fpm.conf #php-fpm主配置文件 /etc/php-fpm.d # /etc/php-fpm.d/www.conf #附加配置文件 /etc/sysconfig/php-fpm /run/php-fpm /usr/lib/systemd/system/php-fpm.service #unit文件(啟動服務(wù)文件) /usr/lib/tmpfiles.d/php-fpm.conf /usr/sbin/php-fpm ...../etc/php.ini是由php-common包帶的。
php.ini是php解釋器環(huán)境的配置,一般不用管。
php-fpm配置文件才是來管理php-fpm進(jìn)程的。
修改/etc/php-fpm.d/www.conf
;listen = 127.0.0.1:9000 listen = 172.16.40.41:9000 #監(jiān)聽端口, 必須修改 ;listen.allowed_clients = 127.0.0.1 listen.allowed_clients = 172.16.40.40 #允許172.16.40.40主機(jī)fcgi連接。必須修改 user = apache #進(jìn)程運行用戶,默認(rèn)。 group = apache pm = dynamic #動態(tài)生成子進(jìn)程方式 pm.max_children = 50 #大子進(jìn)程 pm.start_servers = 5 #服務(wù)剛啟動時生成幾個子進(jìn)程 pm.min_spare_servers = 5 #最少空閑子進(jìn)程,進(jìn)程空閑時會慢慢回收,這是最低要保留子進(jìn)程數(shù)。 pm.max_spare_servers = 35 #大空閑子進(jìn)程。上限。 ;pm.max_requests = 500 #每個子進(jìn)程最多響應(yīng)多少個請求。超過請求,此子進(jìn)程回收。 ;pm.status_path = /status #只要訪問指定的路徑,就返回狀態(tài)信息。狀態(tài)模塊 ;ping.path = /ping #提供ping模塊,用來遠(yuǎn)程檢測php是否在線。訪問指定的路徑,返回ping.response指定的值。 ;ping.response = pong #與png.path成對出現(xiàn)。 php_admin_flag = on #php日志中與管理相關(guān)的標(biāo)志是否打開。 php_value[session.save_handler] = files #session存儲方式 php_value[session.save_path] = /var/lib/php/session #session存儲路徑上面只有兩個地址修改了,其它的都是默認(rèn)值,看情況修改吧。
創(chuàng)建測試文件:
[root@localhost ~]# mkdir /web/php/{blog,phpmyadm} -pv [root@localhost ~]# vim /web/php/blog/index.php <h2>www.star.com</h2> <?php phpinfo(); ?> [root@localhost ~]# vim /web/php/phpmyadm/index.php <h2>myadm.star.com</h2> <?php phpinfo(); ?>啟動php-fpm.
[root@localhost ~]# systemctl start php-fpm訪問http://myadm.star.com/index.php
另一個也正常。
xcache:
安裝環(huán)境:
[root@localhost php]# yum install php-develxcache目錄:
[root@localhost xcache-3.2.0]# phpize Configuring for: PHP Api Version: 20100412 Zend Module Api No: 20100525 Zend Extension Api No: 220100525 [root@localhost xcache-3.2.0]# ./configure --enable-xcache --with-php-config=/usr/bin/php-config [root@localhost xcache-3.2.0]# make [root@localhost xcache-3.2.0]# make install Installing shared extensions: /usr/lib64/php/modules/ [root@localhost xcache-3.2.0]# cp xcache.ini /etc/php.d/ [root@localhost xcache-3.2.0]# systemctl restart php-fpm現(xiàn)來查看網(wǎng)頁,我這里已現(xiàn)加載xcache了。也可以用php-fpm -m命令來查看php-fpm加載的所有模塊。
[root@localhost xcache-3.2.0]# php-fpm -m ..... XCache XCache Cacher xml zip zlib [Zend Modules] XCache XCache Cacher三、MySQL
安裝:
[root@localhost ~]# yum install mariadb-server授權(quán)wordpress(phpMyadmin不用授權(quán)):
MariaDB [(none)]> CREATE DATABASE wordpress; Query OK, 1 row affected (0.01 sec) MariaDB [(none)]> GRANT ALL ON wordpress.* TO 'wpuser'@'172.16.40.41' IDENTIFIED BY 'abcdefg'; Query OK, 0 rows affected (0.00 sec)四、安裝phpMyAdmin和wordpress.
httpd:
[root@localhost ~]# cp -rf phpMyAdmin-4.4.15.2-all-languages/* /web/vhosts/phpmyadm/ [root@localhost ~]# cp wordpress/* /web/vhosts/blog/ -rfphp-fpm:
[root@localhost ~]# rm -rf /web/php/phpmyadm/* [root@localhost ~]# rm -rf /web/php/blog/* [root@localhost ~]# cp -rf phpMyAdmin-4.4.15.2-all-languages/* /web/php/phpmyadm/ [root@localhost ~]# cp -rf wordpress/* /web/php/blog/[root@localhost blog]# pwd /web/php/blog [root@localhost blog]# cp wp-config-sample.php wp-config.php [root@localhost blog]# vim wp-config.phpphpMyadmin:
[root@localhost blog]# cd ../phpmyadm/ [root@localhost phpmyadm]# cp config.sample.inc.php config.inc.php [root@localhost phpmyadm]# openssl rand -base64 15 #生成隨機(jī)碼 EumYt+cNhpOquCvJ1mRN [root@localhost phpmyadm]# vim config.inc.php填上隨機(jī)碼,和目標(biāo)數(shù)據(jù)庫。
訪問:www.star.com/
訪問:http://myadm.star.com/
php主機(jī)安裝php-string:
[root@localhost phpmyadm]# yum install php-mbstring重新加載php配置文件:
[root@localhost phpmyadm]# systemctl reload php-fpm不能保存session會話。查看一下運行php-fpm的用戶。
[root@localhost phpmyadm]# ps aux | grep php-fpm查看配置文件中所指定的session保存位置,用戶是否有寫入權(quán)限。
php_value[session.save_handler] = files php_value[session.save_path] = /var/lib/php/session查看一下所指向的文件:
[root@localhost ~]# ll /var/lib/php total 0沒有session目錄,創(chuàng)建目錄,并給于運行php-fpm用戶寫入權(quán)限。
[root@localhost ~]# mkdir /var/lib/php/session [root@localhost ~]# chown -R apache /var/lib/php/session/對了,我們這里還沒有創(chuàng)建用于遠(yuǎn)程登錄的root用戶。先試一下用wpuser用戶吧。
創(chuàng)建用戶要創(chuàng)建基于php主機(jī)IP登錄的。因為是php程序發(fā)起的連接,而不是我們。
五、添加status頁面。
1、確認(rèn)模塊是否加載。
[root@localhost httpd]# pwd /etc/httpd [root@localhost httpd]# vim conf.modules.d/00-base.conf LoadModule status_module modules/mod_status.so [root@localhost conf.d]# httpd -M #查看當(dāng)前加載的動態(tài)模塊。status模塊,會顯示httpd整體的狀態(tài),無論是把指令寫在虛擬主機(jī)里面還是外面,只要觸發(fā)就會顯示整體服務(wù)的狀態(tài)。
所以可以建立個新的配置文件,也可以寫到虛擬主機(jī)的里面,只是寫虛擬主機(jī)里面的話只有訪問對應(yīng)的主機(jī)名才能返回狀態(tài)頁。
[root@localhost httpd]# vim conf.d/status.conf <Location ~ "/status"> SetHandler server-status Require all granted </Location>[root@localhost httpd]# systemctl reload httpd我這里用IP地址訪問的,用主機(jī)名也是一樣,它現(xiàn)在是公共配置。
但是現(xiàn)在的配置所有人都可以查看,而且用IP控制也不保險。那么就可以用用戶名控制了。
首先創(chuàng)建用戶和密碼文件。
htpasswd [options] /PATH/TO/HTTPD_PASSWD_FILE username
-c:自動創(chuàng)建此處指定的文件,因此,僅應(yīng)該在此文件不存在時使用;
-m:md5格式加密
-s: sha格式加密
-D:刪除指定用戶
我這里就在/etc/httpd/conf下面創(chuàng)建了。
[root@localhost conf]# htpasswd -c -m .htpasswd star New password: Re-type new password: Adding password for user star [root@localhost conf]# htpasswd -m .htpasswd tom New password: Re-type new password: Adding password for user tom只有第一次創(chuàng)建文件要用到-c。
[root@localhost conf]# cat .htpasswd star:$apr1$vq6uL8/A$c7agaUbQOoBd9Lkj8xrCW. tom:$apr1$Iawy2r6d$wonFrBM4yIEgBPUwY0ktU/ jerry:$apr1$vdpkCLQV$HSJShQU0yvjna75T8hXqK/ [root@localhost conf]#如果用戶有很多還可以有組文件。手動創(chuàng)建就可以。文件中一行一組。
格式:
group: user1 user2
group2: user1 user 2
[root@localhost conf]# vim .htgroup mygrp: star tom grp: jerry zhangsan修改配置文件:conf.d/status.conf
<Location ~ "/status"> SetHandler server-status AuthType Basic AuthName "Enter your Access" AuthUserFile "conf/.htpasswd" AuthGroupFile "conf/.htgroup" Require Group mygrp </Location>重載服務(wù)。 再來看看。這次訪問www.star.com
jerry用戶在grp組里,不能登錄。 只有star和tom可以登錄。
如果想再加上IP控制的話,就要用上訪問控制的容器了。
只要指令有兩條,都要放到容器里(包括兩個IP的或一IP一用戶的)
這樣就只有IP是允許的情況下才可以到用戶名的部分,
如果ip是拒絕的,根本就不會到用戶名的部分。
這里不管是用戶還是IP都是認(rèn)證。是統(tǒng)一的。所以就算是在上級目錄里是IP是拒絕的。
在當(dāng)前的級別只要用戶名可以通過也是可以訪問的。
只有真和假的兩種情況,不管是哪種認(rèn)證。
而RequireAll這種容器就是為了把里面的多種或多個認(rèn)證綜合成一個真或假。
注意:一定要加容器,這樣它們都會判斷,而不會發(fā)生IP通過,就不判斷用戶的情況了。
還是剛才的配置文件。
<Location ~ "/status"> #不加~只能是根目錄/status。加上~會來匹配,路徑不是根目錄也沒關(guān)系。 SetHandler server-status <RequireAll> AuthType Basic #驗證類型,也可以用digest,不過瀏覽器并不通用。 AuthName "Enter your Access" #提示給客戶端的信息。 AuthUserFile "conf/.htpasswd" #存儲用戶名的文件 AuthGroupFile "conf/.htgroup" #存儲組的文件 Require group mygrp #允許的組 Require ip 172.16.40.2 #ip控制,只允許172.16.40.2 </RequireAll> </Location>如果不用組的話,可以不寫AuthGroupFile,把Requre group 改為Require user即可。Require valid-user表示文件中的所有用戶。
我這開網(wǎng)頁的主機(jī)IP是172.16.40.1。現(xiàn)在打不開了。
改回只讓我這臺主機(jī)訪問:
Require ip 172.16.40.1
現(xiàn)在又出來讓輸入用戶碼的窗口了。但是這樣我們的密碼只是簡單的md5加密傳輸?shù)摹?/p>
或是用抓包工具都可以抓到,就算破解不了,但cookie卻是不加密的。
其實這里想告訴大家,在一些沒有https的網(wǎng)站的表單中填入的密碼和傳輸?shù)男畔⑵鋵嵍际敲魑膫鬏數(shù)?,連md5加密都沒有。要注意密碼安全。如我們上面登錄phpMyadmin的時候。
我這里用tcpdump抓一下包看看。
star@sst-pp:~/desktop$ sudo tcpdump -X -nn dst host 172.16.40.40 and port 80 -w /tmp/myadm用vim打開/tmp/myadm搜索user打一下。
還記得上面我們所輸入的數(shù)據(jù)庫的數(shù)據(jù)嗎。如果是root用戶,你懂的。所以用https是必須的。
上一篇已經(jīng)寫了,而且基本也都一樣。而不在同一臺主機(jī)的CA也只是遠(yuǎn)程復(fù)制一下文件而已。
php的status。
我們現(xiàn)在的httpd只有.php的頁面會向后轉(zhuǎn)發(fā),其它頁面是不會轉(zhuǎn)發(fā)的,所以要把php上面的pm.status_path = /status 改一下。如果改成.php就直接可用了。而且因為我們上面httpd狀態(tài)頁是用~匹配status的,所以也會區(qū)配到那個Location里面,也要通過認(rèn)證。
而sethandler那里,我覺得可能過程是:
1、sethandler指令,開始準(zhǔn)備數(shù)據(jù),生成html文件。
2、數(shù)據(jù)接著執(zhí)行,到達(dá)虛擬主機(jī)那里,因為是.php的文件,所以轉(zhuǎn)發(fā)到php主機(jī)上面。
3、php主機(jī)生成數(shù)據(jù),html文件。 傳給httpd。
4、httpd上面原來由sethandler生成的數(shù)據(jù)就被新的數(shù)據(jù)所覆蓋了。
注意:沒有寫在虛擬主機(jī)里面的是公共部分,在數(shù)據(jù)到達(dá)虛擬主機(jī)之前都是會過一遍的。
遇到指令就操作一次。 就好像在有各種機(jī)關(guān)的房間里面經(jīng)過一樣,最終還要再進(jìn)入不同的門。
而如果不想用.php這種方式,就要再添加個轉(zhuǎn)發(fā)了。如我這里想用status-php,現(xiàn)在的status.conf文件。
<Location "/status"> SetHandler server-status <RequireAll> AuthType Basic AuthName "Enter your Access" AuthUserFile "conf/.htpasswd" AuthGroupFile "conf/.htgroup" Require group mygrp Require ip 172.16.40.1 </RequireAll> </Location> ProxyPassMatch ^/status-php$ fcgi://172.16.40.11:9000 #添加一個轉(zhuǎn)發(fā)。轉(zhuǎn)發(fā)只能寫在主服務(wù)器或虛擬主機(jī)里。 <Location "/status-php"> #加上用戶認(rèn)證。 <RequireAll> AuthType Basic AuthName "Enter your Access" AuthUserFile "conf/.htpasswd" AuthGroupFile "conf/.htgroup" Require group grp Require ip 172.16.40.1 </RequireAll> </Location>php里面改一下:
pm.status_path = /status-php這里再貼一下CA的過程。
私有CA:
ca的配置文件:/etc/pki/tls/openssl.cnf 在lamp1中已經(jīng)介紹了,這里就不多說了。
當(dāng)前目錄:/etc/pki/CA
[root@localhost CA]# (umask 077;openssl genrsa -out private/cakey.pem 4096) #生成CA的私鑰: [root@localhost CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem #生成自簽證書,也做根證書,證書鏈 You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:CN State or Province Name (full name) []:BEIJING Locality Name (eg, city) [Default City]:BEIJING Organization Name (eg, company) [Default Company Ltd]:LinuxOPS Organizational Unit Name (eg, section) []:Ops Common Name (eg, your name or your server's hostname) []:ca.star.com Email Address []: [root@localhost CA]# [root@localhost CA]# touch serial [root@localhost CA]# echo 00 > serial [root@localhost CA]# touch index.txtHTTPD:
[root@localhost httpd]# pwd /etc/httpd [root@localhost httpd]# mkdir ssl [root@localhost httpd]# (umask 077;openssl genrsa -out ssl/myadm.key 2048) #生成私鑰 Generating RSA private key, 2048 bit long modulus ..........................................................................................+++ ............................+++ e is 65537 (0x10001) [root@localhost httpd]# openssl req -new -key ssl/myadm.key -out /tmp/myadm.csr #生成證書申請 You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:CN State or Province Name (full name) []:BEIJING Locality Name (eg, city) [Default City]:BEIJING Organization Name (eg, company) [Default Company Ltd]:LinuxOPS Organizational Unit Name (eg, section) []:Ops Common Name (eg, your name or your server's hostname) []:myadm.star.com Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:把證書申請發(fā)給CA。
[root@localhost httpd]# scp /tmp/myadm.csr 172.16.40.20:/tmp/ root@172.16.40.20's password: myadm.csr 100% 1009 1.0KB/s 00:00 [root@localhost httpd]#如果沒有scp命令,要安裝openssh-clients包。兩邊都要有這個命令。
CA:
ca簽署:
[root@localhost CA]# openssl ca -in /tmp/myadm.csr -out certs/myadm.crt Using configuration from /etc/pki/tls/openssl.cnf Check that the request matches the signature Signature ok Certificate Details: Serial Number: 0 (0x0) Validity Not Before: Jan 26 09:38:33 2016 GMT Not After : Jan 25 09:38:33 2017 GMT Subject: countryName = CN stateOrProvinceName = BEIJING organizationName = LinuxOPS organizationalUnitName = Ops commonName = myadm.star.com X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: 9D:FD:70:BD:97:BB:BB:E4:61:55:7B:6C:BA:B2:FD:B6:93:DC:8E:EC X509v3 Authority Key Identifier: keyid:AA:DA:31:1A:3F:5B:F3:D5:D2:0C:93:4E:37:78:9B:38:E6:C8:FB:26 Certificate is to be certified until Jan 25 09:38:33 2017 GMT (365 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated [root@localhost CA]#把證書傳回給HTTPD:
[root@localhost CA]# scp certs/myadm.crt 172.16.40.40:/etc/httpd/ssl/ The authenticity of host '172.16.40.40 (172.16.40.40)' can't be established. RSA key fingerprint is ec:8e:a7:90:97:03:2c:e4:78:d8:04:98:7d:9a:59:1c. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '172.16.40.40' (RSA) to the list of known hosts. root@172.16.40.40's password: myadm.crt 100% 5714 5.6KB/s 00:00 [root@localhost CA]#另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
當(dāng)前標(biāo)題:LAMP之二(PHP-FPM)-創(chuàng)新互聯(lián)
當(dāng)前網(wǎng)址:http://aaarwkj.com/article22/dsjejc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)、網(wǎng)站制作、商城網(wǎng)站、微信公眾號、ChatGPT、外貿(mào)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容